2013-05-29 36 views
1

我有一個Android設備將運行一個服務器,客戶端將連接到其他Android設備。我在非阻塞模式下使用SocketChannelServerSocketChannelAndroid ServerSocketChannel綁定到回送地址

這是我的代碼,用於初始化服務器設備上的ServerSocketChannel: ServerSocketChannel serverSocketChannel; ServerSocket serverSocket;

 InetSocketAddress address = new InetSocketAddress(InetAddress.getLocalHost().getHostAddress(), 10000); 

     serverSocketChannel = ServerSocketChannel.open(); 
     serverSocketChannel.configureBlocking(false); 

     serverSocket = serverSocketChannel.socket(); 
     serverSocket.bind(address); 

     serverSocketChannel.register(selector, SelectionKey.OP_ACCEPT); 

     Log.i("AdminNetwork", serverSocket.getInetAddress().getHostAddress()); 

當客戶端設備嘗試連接到服務器設備的連接超時,並用一個空消息的則拋出ConnectException。我打電話給Log.i()檢查ServerSocket綁定的IP地址。當代碼執行輸出時,IP地址是'127.0.0.1'。我在普通的Java應用程序中嘗試了代碼,並打印了計算機的內部IP地址。當我在計算機上運行服務器時,客戶端連接成功。

我認爲問題在於ServerSocket綁定到環回地址,導致客戶端連接失敗。這是導致客戶超時的問題嗎?如果它是我如何解決它?

回答

2

這是一種可能性。 InetAddress.getLocalHost().getHostAddress()可以返回127.0.0.1::1或服務器本地的任何其他IP地址。

只需通過null而不是此值:這相當於INADDR_ANY,它允許服務器通過其任何接口接受連接。

+0

測試它和客戶端連接。謝謝! – jakeprogrammer