2014-11-08 2 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

+0

문제를 해결했습니다. 밖으로 나가 소켓 생성 전에 클라이언트에서 응답으로 게시 할 코드를 사용해야하며 호스트 이름 대신 주소가 지정된 주소로 작업하도록 변경해야했습니다. – cruelcore1

답변

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;