1. 程式人生 > >Java實現Socket5代理伺服器

Java實現Socket5代理伺服器

直接貼程式碼,不解釋

1 主服務,用來偵聽埠

package org.javaren.proxy;

import java.net.ServerSocket;
import java.net.Socket;

public class SocketProxy {
	/**
	 * @param args
	 */
	public static void main(String[] args) throws Exception {
		ServerSocket serverSocket = new ServerSocket(8888);
		while (true) {
			Socket socket = null;
			try {
				socket = serverSocket.accept();
				new SocketThread(socket).start();
			} catch (Exception e) {
				e.printStackTrace();
			}
		}
	}
}

2 核心程式碼,處理連結的代理執行緒

內部設計了Socket的認證,自己看吧

package org.javaren.proxy;

import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.Socket;

public class SocketThread extends Thread {
	private Socket socketIn;
	private InputStream isIn;
	private OutputStream osIn;
	//
	private Socket socketOut;
	private InputStream isOut;
	private OutputStream osOut;

	public SocketThread(Socket socket) {
		this.socketIn = socket;
	}

	private byte[] buffer = new byte[4096];
	private static final byte[] VER = { 0x5, 0x0 };
	private static final byte[] CONNECT_OK = { 0x5, 0x0, 0x0, 0x1, 0, 0, 0, 0, 0, 0 };

	public void run() {
		try {
			System.out.println("\n\na client connect " + socketIn.getInetAddress() + ":" + socketIn.getPort());
			isIn = socketIn.getInputStream();
			osIn = socketIn.getOutputStream();
			int len = isIn.read(buffer);
			System.out.println("< " + bytesToHexString(buffer, 0, len));
			osIn.write(VER);
			osIn.flush();
			System.out.println("> " + bytesToHexString(VER, 0, VER.length));
			len = isIn.read(buffer);
			System.out.println("< " + bytesToHexString(buffer, 0, len));
			// 查詢主機和埠
			String host = findHost(buffer, 4, 7);
			int port = findPort(buffer, 8, 9);
			System.out.println("host=" + host + ",port=" + port);
			socketOut = new Socket(host, port);
			isOut = socketOut.getInputStream();
			osOut = socketOut.getOutputStream();
			//
			for (int i = 4; i <= 9; i++) {
				CONNECT_OK[i] = buffer[i];
			}
			osIn.write(CONNECT_OK);
			osIn.flush();
			System.out.println("> " + bytesToHexString(CONNECT_OK, 0, CONNECT_OK.length));
			SocketThreadOutput out = new SocketThreadOutput(isIn, osOut);
			out.start();
			SocketThreadInput in = new SocketThreadInput(isOut, osIn);
			in.start();
			out.join();
			in.join();
		} catch (Exception e) {
			System.out.println("a client leave");
		} finally {
			try {
				if (socketIn != null) {
					socketIn.close();
				}
			} catch (IOException e) {
				e.printStackTrace();
			}
		}
		System.out.println("socket close");
	}

	public static String findHost(byte[] bArray, int begin, int end) {
		StringBuffer sb = new StringBuffer();
		for (int i = begin; i <= end; i++) {
			sb.append(Integer.toString(0xFF & bArray[i]));
			sb.append(".");
		}
		sb.deleteCharAt(sb.length() - 1);
		return sb.toString();
	}

	public static int findPort(byte[] bArray, int begin, int end) {
		int port = 0;
		for (int i = begin; i <= end; i++) {
			port <<= 16;
			port += bArray[i];
		}
		return port;
	}

	// 4A 7D EB 69
	// 74 125 235 105
	public static final String bytesToHexString(byte[] bArray, int begin, int end) {
		StringBuffer sb = new StringBuffer(bArray.length);
		String sTemp;
		for (int i = begin; i < end; i++) {
			sTemp = Integer.toHexString(0xFF & bArray[i]);
			if (sTemp.length() < 2)
				sb.append(0);
			sb.append(sTemp.toUpperCase());
			sb.append(" ");
		}
		return sb.toString();
	}
}


3  讀取執行緒,負責外面讀資料,寫入到請求端

package org.javaren.proxy;

/**
 * * 從外部讀取,向內部發送資訊
 */
import java.io.InputStream;
import java.io.OutputStream;

public class SocketThreadInput extends Thread {
	private InputStream isOut;
	private OutputStream osIn;

	public SocketThreadInput(InputStream isOut, OutputStream osIn) {
		this.isOut = isOut;
		this.osIn = osIn;
	}

	private byte[] buffer = new byte[409600];

	public void run() {
		try {
			int len;
			while ((len = isOut.read(buffer)) != -1) {
				if (len > 0) {
					System.out.println(new String(buffer, 0, len));
					osIn.write(buffer, 0, len);
					osIn.flush();
				}
			}
		} catch (Exception e) {
			System.out.println("SocketThreadInput leave");
		}
	}
}

4 寫入執行緒,負責讀取請求端資料,寫入到目標端
package org.javaren.proxy;

import java.io.InputStream;
import java.io.OutputStream;

/**
 * 從內部讀取,向外部發送資訊
 * 
 * @author zxq
 * 
 */
public class SocketThreadOutput extends Thread {
	private InputStream isIn;
	private OutputStream osOut;

	public SocketThreadOutput(InputStream isIn, OutputStream osOut) {
		this.isIn = isIn;
		this.osOut = osOut;
	}

	private byte[] buffer = new byte[409600];

	public void run() {
		try {
			int len;
			while ((len = isIn.read(buffer)) != -1) {
				if (len > 0) {
					System.out.println(new String(buffer, 0, len));
					osOut.write(buffer, 0, len);
					osOut.flush();
				}
			}
		} catch (Exception e) {
			System.out.println("SocketThreadOutput leave");
		}
	}
}

效果還不錯,用firefox/ ie都測試過,可用。

相關推薦

Java實現Socket5代理伺服器

直接貼程式碼,不解釋1 主服務,用來偵聽埠package org.javaren.proxy; import java.net.ServerSocket; import java.net.Socket; public class SocketProxy { /**

JAVA寫HTTP代理伺服器(一)-socket實現

HTTP代理伺服器是一種特殊的網路服務,允許一個網路終端(一般為客戶端)通過這個服務與另一個網路終端(一般為伺服器)進行非直接的連線。一些閘道器、路由器等網路裝置具備網路代理功能。一般認為代理服務有利於保障網路終端的隱私或安全,防止攻擊。 HTTP

JAVA寫HTTP代理伺服器(二)-netty實現

接上一篇,因為是用BIO的一個連線一個執行緒去處理,對於HTTP這種短連線協議來說CPU開銷是非常大的,就算加入了執行緒池也不能完美解決BIO的缺陷,所以可以用NIO進行伺服器的優化,NIO基於IO多路複用以實現單執行緒處理大量連線,但是編寫起來比較複雜,

java實現反向代理服務器

response connect enc char exception pos httputil let commons 1.寫的一個簡單的例子 package forword; import java.io.IOException; import javax.ser

Java實現sock5代理服務器

KS PV 下載 原版 java實現 sock 以及 異常 包括 入職練手socks5代理服務器,過程總結一下。 1.下載火狐瀏覽器,設定代理為socks5代理,地址為127.0.0.1:1080。 2.socks5協議1928,中文版,原版,認真閱讀 3.按照協議通過Ja

java實現連線vsftpd伺服器,上傳,下載,刪除。

核心程式碼如下: package com.bh.service; import java.io.ByteArrayInputStream; import java.io.File; import java.io.FileOutputStream; import java.io.IOExcep

java實現讀寫伺服器檔案

https://github.com/MAXIAODONGS/Remote-operation-of-static-resources 這個主要實現java遠端訪問伺服器的讀寫檔案操作,自動登入讀寫檔案,以上程式碼整理來自網際網路,然後自己將很多瑣碎的東西整理在了一起 pom.xml要配置

使用Java實現動態代理工具包

import java.lang.reflect.InvocationHandler; import java.lang.reflect.Method; import java.lang.reflect.Proxy; public class ProxyFactory { private

java實現 連線遠端伺服器 執行Linux命令 並獲取 執行返回的結果

情景:要通過java連線伺服器,並執行指令碼命令 得到 返回的結果 package com.ideal.openapi.util; import com.jcraft.jsch.*; import org.slf4j.Logger; import org.slf4j.LoggerFacto

java實現動態代理的三種方法

緒論:以下三種java實現動態代理的的方式,分別為基於jdk的,基於cglib的和基於javassist的,其中需要注意的兩點 一:基於jdk實現的動態代理需要實現父類,而其他兩種不需要 二:其中基於cglib的需要額外的jar包依賴,pom的依賴如下 <!-- https://m

利用Apache的轉發模組實現反向代理伺服器

問題又來公司的LAMP伺服器使用Apache的VirtualHost功能部署了多個擁有獨立域名的網站。httpd.conf配置檔案部分如下:# 省略本文無關部分 Listen 80 # www.xxx.com <VirtualHost *> Server

JAVA實現簡易HTTP伺服器

說實話,之前完全沒有想過,我還能寫出伺服器。感覺伺服器這麼高階的東西,能會用就不錯了,還能寫。 不吐槽了,開始了。 這次的作業是搭建一個伺服器,要能接收請求,並給瀏覽器返回正確響應。 專案的下載地址 專案目標:實現一個簡易的多執行

java實現下載網路伺服器上的附件/圖片到本地

新人小白一枚,記錄下工作中遇到的一點問題和解決方案。僅供自己以後複習參考之用。歡迎大神指導,交流。剛開始學寫部落格,不好的地方請委婉的指出來哦。先來說說需求背景使用java來實現從網站網頁獲取內容(抓取網頁)。可能會遇到以下兩種情況(我暫時就只是遇到了這兩種情況)。1、jav

Java實現通過smtp伺服器驗證郵箱的真實有效性

要用到commons-net-3.3.jar、dnsjava-2.1.7.jar包 大部分的國內常見郵箱都能準確驗證。 驗證頻率和數量多的話容易被封掉ip package com.tieniu; import java.io.IOException; import o

基於Java實現簡單Http伺服器之一

        本文將詳細介紹如何基於java語言實現一個簡單的Http伺服器,文中將主要介紹三個方面的內容:1)Http協議的基本知識、2)java.net.Socket類、3)java.net.ServerSocket類,讀完本文後你可以把這個伺服器用多執行緒的技術重新編

Java 實現socket 與伺服器實現實時通訊

        現在有一個需求,就是要去給一臺客戶端主動去傳送指令,或者推送訊息,就尋求朋友問了問告訴我說socket可以實現,所以就在網上找了些資料一遍學習,一遍測試,現在把我最後的成果記錄下來。        如果對於socket有概念上的不理解的話,可以去百度一下會有很

Java實現簡易Tomcat伺服器(清晰易懂)

Tomcat伺服器是一個輕量級的Java程式碼實現的WEB伺服器。這篇文章將會講述如何用Java實現一個簡易版的Tomcat伺服器。 簡單的講,簡易原理是這樣的: 1. Tomcat開始執行之後,會在主機上開一個埠(預設是80埠),在所開闢的埠上執行一個ServerSock

java實現動態代理時遇到的問題

java中實現動態代理,用InvocationHandler和Proxy就可以了。 所謂的動態代理,就是真正執行操作的物件不是原始的物件,就像A拜託B買東西,然後B買好東西后包裝好給A。 例: void iTest() throws Exception {

在Spring應用除錯中實現反向代理伺服器

反向代理(Reverse Proxy)方式是指以代理伺服器來接受internet上的連線請求,然後將請求轉發給內部網路上的伺服器,並將從伺服器上得到的結果返回給internet上請求連線的客戶端,此時代理伺服器對外就表現為一個反向代理伺服器。 簡單來說,你的反向代理伺服

Java實現FTP跨伺服器檔案操作

在過去的幾年工作中,曾經多次需要把檔案上傳到單獨的伺服器,而程式是在單獨的伺服器上部署的,在進行檔案操作的時候就需要跨伺服器進行操作包括:檔案上傳、檔案下載、檔案刪除等。跨伺服器檔案操作一般是需要FTP協議和SFTP協議兩種,現在就通過Java實現FTP協議的檔案上傳。要實現FTP操作檔案需要引入jar包: