2016-08-31 4 views
-1

Android로 소켓 프로그래밍에 대해 배우고 있습니다. 두 대의 모바일 장치가 있습니다. 둘 다 다른 WiFi 네트워크에 연결됩니다. 내 서버 앱이 하나의 기기에서 실행 중이고 클라이언트 앱이 다른 기기에서 실행 중입니다. 다른 WiFi 네트워크가있는 서버에 클라이언트를 연결할 수 없습니다. 왜?
불쌍한 의사 소통에 큰 도움이됩니다.다른 WiFi 네트워크의 소켓 서버에 소켓 클라이언트를 연결할 수 없습니다.

클라이언트 코드 :

class ClientSideThread extends Thread { 

    String response; 

    @Override 
    public void run() { 

     try { 
      socket = new Socket("192.168.1.111",8085); 

      OutputStream outToServer = socket.getOutputStream(); 
      DataOutputStream out = new DataOutputStream(outToServer); 
      out.writeUTF("hi"); 
      InputStream inFromServer = socket.getInputStream(); 

      DataInputStream in = new DataInputStream(inFromServer); 

      response = in.readUTF(); 

      out.close(); 
      in.close(); 
      socket.close();     

     } catch (UnknownHostException e) { 
      e.printStackTrace(); 
      response = "UnknownHostException: " + e.toString(); 
     } catch (IOException e) { 
      e.printStackTrace(); 
      response = "IOException: " + e.toString(); 
     } 
    } 
} 

서버 코드 : 당신은 그들이 두 개의 서로 다른 WiFi 네트워크에 있는지 언급

private class SocketServerThread extends Thread { 
    @Override 
    public void run() { 
     try { 
      serverSocket = new ServerSocket(socketServerPORT); 

      while (true) { 
       Socket socket = serverSocket.accept(); 
       sIpAddress = socket.getInetAddress(); 
       sPort = socket.getPort(); 
       BufferedReader reader = new BufferedReader(new InputStreamReader(socket.getInputStream())); 
       String line; 
       StringBuilder sb = new StringBuilder(); 
       if ((line = reader.readLine()) != null) { 
        sb.append(line); 
       } 
       message = sb.toString(); 
       printWriter = new PrintWriter(socket.getOutputStream()); 
       printWriter.println(message); 
       printWriter.flush(); 

       MainActivity.this.runOnUiThread(new Runnable() { 

        @Override 
        public void run() { 
         String sDisplayMsg = "Replay:" + message; 
         TextView rowTextView = new TextView(MainActivity.this); 
         rowTextView.setText(sDisplayMsg); 
         linearLayout.addView(rowTextView); 
        } 
       }); 
      } 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } 
    } 
} 
+0

서버가 포트를 수신하고 클라이언트가 연결 요청을 보내고 있는지 확인 했습니까? –

+0

예 클라이언트 코드에서 소켓 시간 초과 예외가 발생했습니다. – Siddharthan

+0

클라이언트 측에서 출력 스트림을 쓸 수 없을 때 발생할 수 있습니다. 서버 측의 socketServerPORT 대신 포트 번호 8085를 하드 코드하십시오. –

답변

0

. 내 의심은 두 네트워크가 연결되어 있지 않다는 것입니다.

Andriod를 사용하기 전에 클라이언트 네트워크에서 서버 장치 IP 주소에 도달 할 수 있는지 확인하십시오. 랩톱 또는 데스크톱을 클라이언트 네트워크에 연결하고 ping 192.168.1.111 핑 명령을 실행하여 대상 IP에 연결할 수 있는지 확인할 수 있습니다. 연결 가능한 경우 telnet 192.168.1.111 8085을 수행하십시오. 텔넷이 연결되지 않고 ping에 도달 할 수 있으면 서버 소켓은 포트 8085에 바인딩되지 않습니다. ping 자체에 도달 할 수없는 경우 두 라우터는 아마도 상호 연결되지 않습니다. 서버 장치에서 ping이 비활성화되어있을 가능성이 있습니다. tracert 192.168.1.111을 실행하여 네트워크 패킷이 얼마나 멀리 떨어져 있는지 확인할 수 있습니다. 대상 서버의 게이트웨이 IP를 찾으십시오. 찾을 수없는 경우 2 개의 라우터가 연결되어 있지 않으므로 연결해야합니다.

+0

replay.i를 사용해 주셔서 감사하지만 연결할 수 없습니다.이 error.why가 발생하고 있습니다. 데이터의 32 바이트를 사용하여 핑을 192.168.1.118 : 요청 시간이 초과되었습니다. 요청 시간이 초과되었습니다. 요청 시간이 초과되었습니다. 요청 시간이 초과되었습니다. 패킷 통계 : 192.168.1.118 : 패킷 : 보낸 날짜 = 4, 수신 = 0, 손실 = 4 (100 % 손실), – Siddharthan

+0

두 네트워크가 서로 연결되어 있지 않습니다. 확인을 위해서'tracert'와'teltnet'을 시험해보십시오. WiFi 라우터가 모두 사용자의 통제하에 있고 동일한 위치에 있으면 실제 네트워크 케이블을 사용하여 두 라우터를 연결하고 패킷을 서로간에 전달할 수 있도록 구성 할 수 있습니다. 네트워킹을 이해하는 사람의 도움이 필요할 것입니다. 빠른 확인에서 코드가 정상적으로 보입니다. –

+0

대부분의 응용 프로그램에서 아키텍처 관점에서 보았을 때 서버는 인터넷을 통해 액세스 할 수있는 정적 IP가있는 서버에서 실행되는 독립적 인 응용 프로그램이므로 모든 장치에서 액세스 할 수 있습니다. 서버용 독립형 Java 응용 프로그램을 작성하는 것이 좋습니다. 코드는 작성한 Android 코드에서 많이 변경되지 않습니다. –