2014-11-08 67 views
0

我試圖通過套接字連接2個Android設備,但爲什麼它不工作?我試過用IP地址替換主機地址,但沒有成功。(Java/Android)客戶端套接字拋出IOException

服務器端(擴展的AsyncTask):

ServerSocket server; 
int port; 
String hostName 

server = new ServerSocket(0); 
port = server.getLocalPort(); //is sent to client via OR code 

for (Enumeration<NetworkInterface> en = NetworkInterface.getNetworkInterfaces(); en.hasMoreElements();) { 
    NetworkInterface intf = en.nextElement(); 
    for (Enumeration<InetAddress> enumIpAddr = intf.getInetAddresses(); enumIpAddr.hasMoreElements();) { 
     InetAddress inetAddress = enumIpAddr.nextElement(); 
     if (!inetAddress.isLoopbackAddress()) { 
      hostName = inetAddress.getHostName(); //is sent to client via OR code 
     } 
    } 
} 

Socket client = server.accept(); 

客戶端(擴展的AsyncTask):

SocketAddress socketAddress = new InetSocketAddress(serverHostName, serverPort); 
client = new Socket(); 
client.bind(null); 
client.connect(socketAddress, SOCKET_TIMEOUT); //exception happens in this method 
connected = true; 

這裏是堆棧跟蹤:

11-08 03:02:38.050: W/System.err(26424): java.net.SocketTimeoutException: failed to connect to /fe80::b652:7dff:feb5:ece2%wlan0%7 (port 54579) after 10000ms 
11-08 03:02:38.090: W/System.err(26424): at libcore.io.IoBridge.connectErrno(IoBridge.java:150) 
11-08 03:02:38.090: W/System.err(26424): at libcore.io.IoBridge.connect(IoBridge.java:112) 
11-08 03:02:38.120: W/System.err(26424): at java.net.PlainSocketImpl.connect(PlainSocketImpl.java:192) 
11-08 03:02:38.160: W/System.err(26424): at java.net.PlainSocketImpl.connect(PlainSocketImpl.java:459) 
11-08 03:02:38.210: W/System.err(26424): at java.net.Socket.connect(Socket.java:848) 
11-08 03:02:38.210: W/System.err(26424): at com.example.virtualcard.QRInternetClientThread.doInBackground(QRInternetClientThread.java:55) 
11-08 03:02:38.220: W/System.err(26424): at android.os.AsyncTask$2.call(AsyncTask.java:264) 
11-08 03:02:38.220: W/System.err(26424): at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:305) 
11-08 03:02:38.220: W/System.err(26424): at java.util.concurrent.FutureTask.run(FutureTask.java:137) 
11-08 03:02:38.230: W/System.err(26424): at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:208) 
11-08 03:02:38.230: W/System.err(26424): at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1076) 
11-08 03:02:38.230: W/System.err(26424): at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:569) 
11-08 03:02:38.230: W/System.err(26424): at java.lang.Thread.run(Thread.java:856) 
+0

你確定兩個Android設備在同一個網絡上嗎? – RenniePet 2014-11-08 04:06:37

+0

我已經解決了這個問題。事實證明,我應該使用的代碼,我會在套接字創建之前在客戶端的答案中發佈,並且我不得不改變這個東西來處理IP地址而不是主機名。 – cruelcore1 2014-11-08 04:15:47

回答

0

我已經解決了我問題。原來,我應該在套接字創建之前在客戶端上使用這段代碼,並且我不得不改變這個東西來處理IP地址而不是主機名。

InetAddress addr = InetAddress.getByName(serverIP); 
SocketAddress socketAddress = new InetSocketAddress(addr, serverPort); 

//here follows the old client code 
SocketAddress socketAddress = new InetSocketAddress(serverHostName, serverPort); 
client = new Socket(); 
client.bind(null); 
client.connect(socketAddress, SOCKET_TIMEOUT); //exception happens in this method 
connected = true;