0
我有一個託管HTTP服務器的設備,並且是NAT(位於路由器後面)。我想從一個沒有NAT的公共服務器訪問它。 我在一個線程的端口8080在android設備上運行HTTP服務器,經過一段時間後,我啓動了一個客戶端線程,它嘗試從android的本地端口號8080連接到遠程公共服務器。 出於某種原因,在端口8080上啓動服務器後,android客戶端將無法連接。它也不會產生任何異常。這裏是我的代碼:TCP打孔,不能在android上重複使用地址
Thread server = new Thread(new Runnable() {
public void run() {
super.run();
try {
ServerSocket serverSocket = new ServerSocket();
serverSocket.setReuseAddress(true);
serverSocket.bind(new InetSocketAddress("192.168.1.102", 8080));
while(isRunning){
try {
System.out.println("Listening for new connection");
Socket socket = serverSocket.accept();
System.out.println("incoming connection accepted");
new Thread(new ConnectionHandler(socket)).start();
} catch (IOException e) {
e.printStackTrace();
}
}
serverSocket.close();
}
catch (IOException e) {
e.printStackTrace();
}
}
});
server.start();
// sleep several seconds before launch of client
Thread.currentThread().sleep(5 * 1000);
Thread client = new Thread(new Runnable() {
public void run() {
super.run();
try {
/* .. */
Inet4Address localaddr = (Inet4Address) InetAddress
.getByName("192.168.1.102");
// Inet4Address remoteaddr = (Inet4Address)
// InetAddress.getByName("122.176.73.10");
System.out.println("connecting to 122.176.73.10");
Socket socket = new Socket();
socket.setReuseAddress(true);
System.out.println("[Client]socket.isBound():" + socket.isBound());
socket.bind(new InetSocketAddress("192.168.1.102", 8080));
for (int i = 1; i < 5; i++) {
try {
socket.connect(new InetSocketAddress("122.176.73.10", 4040));
System.out.println("connected to 122.176.73.10");
break;
} catch (Exception e) {
System.out.println("[Client]fail to connect ");
Thread.currentThread().sleep(i * 2 * 1000);
}
}
}
}
});
client.start();
據稱這裏工作:http://ramonli.blogspot.in/2012/03/tcp-hole-punching-how-to-establish-tcp.html – rohitverma 2013-02-10 09:59:13