2017-04-17 5 views
0

クライアントとサーバーの間で情報を連続的に共有しようとしていますが、サーバーが読み取り中に停止することがあります。readUTF()関数でサーバーがブロックされました

まず、クライアントが自分自身についてのいくつかの情報(IDとstrの文字列変数)を送信

クライアント

out.writeUTF(id+" "+str); 
out.flush(); 
System.out.println("Do you want a room ?"); 
System.out.println("These are the available room"); 
String a4; 
while((a4=in.readUTF()) != null) 
    System.out.println(a4); 
System.out.println("Pick one"); // It doesn't print that 
sc4 = new Scanner(System.in); 
String str4 = sc4.next(); 
out.writeUTF(str4); 
out.flush(); 

サーバー

out.writeUTF(Room.getAllRooms()); 
out.flush(); 
System.out.println("Before read"); 
String res = in.readUTF(); // stuck here 
System.out.println("After read"); 
. 
. 
. 

すべての客室作品の印刷クライアントで素晴らしい。しかし、すぐに私は印刷することができません "1つを選ぶ"。

サーバーは何も読み取っていませんが、サーバーが最初に読み取り中で、クライアントが最初に書き込みを行わないのはなぜですか?

(私は実際に私がスレッドを使用して、マスター/スレーブ・アーキテクチャを使用している、コードを簡素化)

更新:問題が解決し、応答怒鳴るをお読みください。

+0

あなたはあなたの 'while '状態であまりにも多くをやろうとしているようです。 2つの部分に分割して、ストリングではなくストリームを確認してください。 – rossum

答えて

1

ない「読み取り」ではなくreadUTF()にあなたは「立ち往生」されるのではなくをブロックし、そして(のreadUTF()決してヌルなりません)、そしてその理由は、相手が何かを発信したり、接続を閉じたどちらもということです。これは予想される動作です。 1つwriteUTF()と終わりがないループreadUTF()秒です。あなたのアプリケーションプロトコルについて考えてみましょう。

ところで、あなたはバグがあります:ヌル

while((a4=in.readUTF()) != null) 
    System.out.println(a4); 

readUTF()決して戻ります。ピアが接続を閉じると、EOFExceptionがスローされます。

+0

私は今理解していますが、私はそれをどのように修正できるか考えていますか? – ChrisBlp

+0

私は部屋の数を取得し、この番号にループすることができますが、それを行う最も簡単な方法はありますか? – ChrisBlp

+0

a4の最後の文字列以外のすべての "\ n"を削除して修正しました。このようにして、私はループなしで文字列全体を取得します。ありがとう! – ChrisBlp

関連する問題