2016-04-18 20 views
1

私はWindows用のC#で書かれたサーバーアプリケーションを持っています。私はアンドロイド用のクライアントアプリを持っています。無限ループでクライアントからサーバーまで連続的にデータを送信したい。データが送信されていますが、時には遅延が悪い場合もあります。私は本当にそれに固執しています。クライアントサイドのコードは次のとおりです。ソケットプログラミング:遅延

new Thread(new Runnable() { 
     public void run() { 
      Socket socket = null; 
      PrintWriter out = null; 
      while(true) { 
       try { 
        socket = new Socket(IP, PORT); 
        out = new PrintWriter(socket.getOutputStream(), true); 
        out.println(msg); 
        socket.close(); 
       } catch (IOException e) { 
        e.printStackTrace(); 
       } 
      } 
     } 
    }).start(); 

理由は何ですか?

+0

どのように遅延が悪いですか?サーバーはどこですか?たぶんそれはあなたのネットワークまたはインターネットのルーティングです。 – dahui

+0

時にはコミュニケーションがスムーズです。場合によっては、メッセージは最大5秒の遅延の後に受信されます。あなたが言うなら、私はサーバーサイドコードも添付します。 –

+0

私は必ずしもサーバーのコードを見たいとは思っていませんでした。サーバーの場所に関する情報を私たちに伝えてください。あなたが開発しているのと同じネットワークに接続されていますか?それは仕事で、それは別の国でですか? – dahui

答えて

0

コードが正しいようです。この遅れは、アプリケーションだけでなくネットワークの状態によっても発生する可能性があります。

両方のデバイスからルータにpingを試み、無線接続のためにラグが急上昇していないか確認してください。 pingに時間差がある場合は、アプリケーションにではなく、接続に問題があります。

+0

クライアントからサーバーにpingを実行したところ、最大時間は54.5msでした。 –

2

あなたの問題は、あなたのwhileループの1回の繰り返しごとにソケットを初期化していることです。

new Thread(new Runnable() { 
    public void run() { 
     Socket socket = null; 
     PrintWriter out = null; 
     while(true) { 
      try { 
       socket = new Socket(IP, PORT); 
       out = new PrintWriter(socket.getOutputStream(), true); 
       out.println(msg); 
       socket.close(); 
      } catch (IOException e) { 
       e.printStackTrace(); 
      } 
     } 
    } 
}).start(); 

このように、ループの外にリファクタリング:それは、なぜ、その場合には、設計である場合を除き

new Thread(new Runnable() { 
    public void run() { 
     Socket socket = new Socket(IP, PORT); 
     PrintWriter out = new PrintWriter(socket.getOutputStream(), true); 
     while(true) { 
      try { 
       out.println(msg); 
      } catch (IOException e) { 
       e.printStackTrace(); 
      } 
     } 
     socket.close(); 
    } 
}).start(); 

+0

はい、私もそれを試しました。しかし、その場合、最初のメッセージだけがサーバーで受信されました。最初のメッセージでは、最初の反復で 'msg'の値を意味します。 –

+0

データを送信した後にPrintWriterをフラッシュすると役立ちますか? 'out.flush();' – Knossos

+0

** socket.close(); **は到達不能です。私がそれを削除し、out.flush()を使用しても、効果は同じです。最初のメッセージのみが受信されます。 –