2016-08-31 17 views
-1

私はAndroidでソケットプログラミングについて学んでいます。私は2つのモバイルデバイスを持っています。両方とも異なるWiFiネットワークに接続されています。私のサーバーアプリケーションは1つのデバイスで動作しており、クライアントアプリケーションは別のデバイスで動作しています。私は別の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(); 
     } 
    } 
} 

Serverコード:

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

あなたは、彼らが二つの異なるWiFiネットワーク上にあることに言及。私の疑いは、2つのネットワークが接続されていないことです。

Andriodを試す前に、クライアントデバイスからサーバーデバイスのIPアドレスに到達できるかどうかを確認してください。ラップトップまたはデスクトップをクライアントネットワークに接続して、pingコマンドping 192.168.1.111を発行して、ターゲットIPに到達可能かどうかを調べることができます。到達可能な場合は、telnet 192.168.1.111 8085を実行します。 telnetが接続せずにpingに到達可能な場合、Server Socketはポート8085にバインドされていません。ping自体に到達できない場合、2台のルータはおそらく相互にリンクされていません。サーバーデバイス上でpingが無効になっている可能性があります。 tracert 192.168.1.111を発行して、ネットワークパケットの移動距離を確認できます。ターゲットサーバーのゲートウェイIPを探します。それが見つからなければ、2台のルータはおそらくリンクされておらず、それらをリンクする必要があります。

+0

replay.iをお試しいただきありがとうございますが、私は到達できません。このエラーが発生しています.why?192.168.1.118に32バイトのデータを送ります: リクエストがタイムアウトしました。 要求がタイムアウトしました。 要求がタイムアウトしました。 要求がタイムアウトしました。 パケット統計:192.168.1.118: パケット:送信済み= 4、受信済み= 0、損失= 4(100%損失)、 – Siddharthan

+0

2ネットワークは互いに接続されていません。確認するには 'tracert'と' teltnet'を試してみてください。両方のWiFiルータが制御下にあり、同じ場所にある場合は、2つを物理ネットワークケーブルで接続し、パケットを一方から他方に転送するように設定できます。これを行うためにネットワーキングを理解している人の助けが必要です。 コードはクイックチェックからOKです。 –

+0

ほとんどのアプリケーションではアーキテクチャ上の観点から、インターネット経由でアクセス可能な静的IPを持つサーバー上で実行される独立したアプリケーションであるため、任意のデバイスがアクセスできるようになります。あなたは、サーバー用のスタンドアロンのJavaアプリケーションを作成する方が良いかもしれません。あなたのコードはあなたが書いたAndroidコードから大きく変わることはありません。 –

関連する問題