Java实现Socket5代理服务器
来源:互联网 发布:围巾的各种围法 知乎 编辑:程序博客网 时间:2024/06/05 20:46
直接贴代码,不解释
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 105public 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代理服务器
- java实现代理服务器
- socket5 中的tcp,udp实现
- 使用php的curl类,检测socket5代理服务器可用性
- 用Delphi实现Socket5代理编程
- 用Delphi实现Socket5代理编程
- java实现使用代理服务器创建URL连接
- java实现一个简单的代理服务器
- JAVA写HTTP代理服务器(一)-socket实现
- JAVA写HTTP代理服务器(二)-netty实现
- 用Delphi实现Socket5代理编程系列讲座
- 用Delphi实现Socket5代理编程系列讲座(陈经韬)
- java 使用socket5/http代理做http访问
- java通过代理服务器实现对FTP和HTTP的访问
- java实现socket代理服务器的一些工具设置
- java实现代理服务器,接收客户端连接,发送到对应服务器
- C#实现Web代理服务器
- HTTP代理服务器的实现
- Catalan
- Silverlight 学习——重写DatePicker (二)
- Android 非UI线程使用View.post()方法一处潜在的内存泄漏
- this指针
- 解析虚拟平台关键技术:虚拟交换机
- Java实现Socket5代理服务器
- rsync使用笔记
- Deriche edge detector
- 同步新浪Error: 40009:Error: system error, does multipart has image?解决方案
- 使用Intent安装apk的方法
- 什么是云计算
- edit的输入类型 android:inputtype
- Java文字图像识别(1)[88250原创]
- 详解abstract class和interface的本质