日期:2014-05-20  浏览次数:20757 次

用java实现tcp穿越nat,很多资料,众说纷纭,希望大家一起动手验证
如题,我实现的过程描述一下,有A.B两个客户端分别挂在NA,NB两个nat下面,通过固定IP的服务器S,交换A,B客户端外的nat的公网IP和端口,然后由B向A发起连接,进行打洞(这次绝大多数应该是失败的,我也确实失败了,超时),然后由A再连接B,理论上B已经打过通往A的洞了,这次连接应该能够通过NB跟B连接上,但是我这边失败了,一直连接不上。(以上A,B跟S通讯交换IP已经A,B互相连接和建立监听我都用的同一个端口)。网上有说java的API不支持tcp包组装,所以无法打洞的,我很疑惑,希望做过类似的大家一起过来讨论一下。谢谢
Java TCP/IP 服务器 通信 API

------解决方案--------------------
这排版,看得眼晕。。。

你是怎么打洞的?
------解决方案--------------------
客户端参考样例代码

                final int LOCAL_PORT = 8880;
SocketAddress localAddr = new InetSocketAddress(LOCAL_PORT);
ServerSocket ss = new ServerSocket();
ss.setReuseAddress(true);
ss.bind(localAddr);
Socket socket = new Socket();
socket.setReuseAddress(true);
socket.bind(localAddr);
final String SERVER_IP = "";
final int SERVER_PORT = 60000;
SocketAddress serverAddr = new InetSocketAddress(SERVER_IP,SERVER_PORT);
socket.connect(serverAddr);
sendAndRegist(socket);
List<InetSocketAddress> addresses = receiveAndGetAddresses(socket);
createThreadToDoSomeThing(socket,addresses);
while(true){
Socket s = ss.accept();
createThreadToAccept(s);
}