2017-01-10 5 views
-1

特定のポート上のソケットを使用してクライアントとサーバーの間でデータを交換するスクリプトを作成しました。ために 、私は期待しています: - >受け取ったことがないソケットがデータをフラッシュしない

  • Serverは

  • クライアントを聞いているINTを送信することにより、ソケット

  • サーバーakwnoledgesを開きます!

私はちょうど私がサーバーを終了すると、ここで残酷

が私の(簡単な)コードです、私のクライアントがintを受け取ることに気づきました。 クライアント:

Socket socket = new Socket(SERVER_ADDR, PORT); 
DataOutputStream dOut = new DataOutputStream(socket.getOutputStream()); 
DataInputStream dIn = new DataInputStream(socket.getInputStream()); 

Log.v("[DEBUG]", "waiting aknowledgement"); 
status = dIn.readInt(); //<-- BLOCKS HERE 
Log.v("[DEBUG]", "ack"); //<-- RECEIVED WHEN SERVER IS EXITED 

はサーバー:

try { 

    DataInputStream stdIn = new DataInputStream(client.getInputStream()); 
    DataOutputStream stdOut = new DataOutputStream(client.getOutputStream()); 

    while (incoming) { 

     stdOut.writeInt(1); 
     stdOut.flush(); 

     System.out.println("Waiting..."); 
     var_from_client = stdIn.readInt(); //<-- BLOCKS HERE (BECAUSE CLIENT IS BLOCKED) 

     // ... 
    } 
} catch (Exception e) {} 

どのようにこのエラーを説明するには?

答えて

0

「Socket not flush data」は、まったく関係ありません。これは、デッドロックです。は、アプリケーションのバグによって発生します。

  1. サーバーがintを送信します。
  2. お客様のクライアントはintを受け取ります。
  3. サーバーが別のintを読み取ろうとブロックします。
  4. クライアントはintを送信しません。
  5. サーバーは、存在しない応答intを待ってブロックされているため、別のintを送信できません。
  6. サーバーが送信をブロックされているため、クライアントは別のintを受信しようとしている間にブロックされます。

解決方法:クライアントからintを送信します。

注:

  1. ソケットの出力ストリームをフラッシュは何もしない、とどちらもありません直接巻き付けDataOutputStreamをフラッシュしません。
  2. NEVER例外を無視します。
+0

http://stackoverflow.com/questions/41685367/send-data-from-android-mobile-to-java-server?noredirect=1#comment70569691_41685367を参照してください。私は例外を無視しなかったし、データを正しく送った。よろしく – Anduriel

関連する問題