代çæå¡å¨è§£æ客æ·ç«¯ä¼ å
¥çæ°æ®ï¼å¾å°æå¡å¨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();
}
温馨提示:答案为网友推荐,仅供参考