2013-02-10 61 views
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(); 

回答

0

一個端口號不能用於偵聽傳入連接並建立一個傳出連接。您在8080上的監聽套接字可防止使用該端口的其他任何事情。

+0

據稱這裏工作:http://ramonli.blogspot.in/2012/03/tcp-hole-punching-how-to-establish-tcp.html – rohitverma 2013-02-10 09:59:13