我用java的socket机制编了一个代理服务器,客户端已经与代理建立了连接,如何让代理与web服务器连接?

2024-11-30 23:50:26
推荐回答(1个)
回答1:

代理服务器解析客户端传入的数据,得到服务器ip和端口,然后创建与服务器的连接。解析代码如下:(这里只处理了socket v5的情况,Config的常量对应java.net.SocksConsts)

		try {
// socket v5
// 4byte(5 2 0 2) @see java.net.SocksSocketImpl
int len = dis.read(buffer);
// reply client
dos.write(new byte[]{Config.PROTO_VERS, Config.NO_AUTH});
dos.flush();

// read
// PROTO_VERS(1byte)
// CONNECT(1byte)
// 0(1byte)
// DOMAIN_NAME/IPV4/IPV6(1byte)   DOMAIN_NAME(not consider now)
// addr(IPV4:4byte/IPV6:16byte)
// port>>8&0xff(1byte)
// port&0xff(1byte)
len = dis.read(buffer);
byte addrType = buffer[3];
byte[] applyData = null;

String serverIp = null;
int serverPort = 0;
if (addrType == Config.IPV4) {
serverIp = Util.bytes2ipv4(buffer, 4, 4);
serverPort = buffer[8] << 8 | buffer[9];
// set reply data
applyData = new byte[10];
applyData[1] = Config.REQUEST_OK;
applyData[3] = Config.IPV4;
for (int i = 4; i < 10; i++) {
// fill ip, port
applyData[i] = buffer[i];
}
} else if (addrType == Config.IPV6) {
serverIp = Util.bytes2ipv6(buffer, 4, 16);
serverPort = buffer[20] << 8 | buffer[21];
// set reply data
applyData = new byte[6];
applyData[1] = Config.REQUEST_OK;
applyData[3] = Config.IPV6;
applyData[4] = buffer[20];
applyData[5] = buffer[21];
}
// reply
dos.write(applyData);
dos.flush();

// connect the server
// serverIp是服务器ip,serverPort是服务器端口,用这两个
// 创建与服务器的socket连接
Socket socket = new Socket(serverIp, serverPort);
// 之后处理客户端与服务器的数据交互就用这个socket转发就行了

// finally success!!!
} catch (Exception e) {
    e.printStackTrace();
}