そのため、コーディングしているマルチクライアント サーバー アプリケーションでいくつかの実際の問題が発生しています。多くのことをいじった後、bin.readLine の後に配置した in.read() メソッドは通常その情報を受け取りますが、時折、情報が送信されなかったかのようにハングすることに気付きました。これは、すべての情報がまったく同じ方法で同じ順序で送信されたにもかかわらずです。簡単にするために、この状況をテストするための非常に単純なクライアント サーバー プログラムを作成しました。
クライアントとサーバーの両方が while (true){ を使用して継続的にループし、両方とも System.out.println(here1) または (here2) などを使用して、コードのどこで予期しない動作が発生したかを確認できるようにします。つまり、これはクライアント側の while ループです。in.read(); ループの一番下にあるのは、サーバーの while ループも一番下に到達するまでブロックするためだけにあるため、クライアントがサーバーよりも速くループすることはありません。
while (true){
System.out.println("here1");
pout.println("Hello everybody");
System.out.println("here2");
out.write(150);
System.out.println("here3");
in.read();
}
そして、これはサーバーの while ループです。
while (true){
System.out.println("here1");
String a = bin.readLine();
System.out.println("here2");
int b = in.read();
System.out.println("here3");
System.out.println(a);
System.out.println(b);
out.write(1);
}
一部のアプリケーションを実行すると、すべてが期待どおりに動作し、ループが繰り返され、here1..2..3 の継続的に繰り返されるリストが出力されます。サーバー側はこちら1..2..3. 続いて Hello Everyone、150。 . ただし、クライアント側では、すべてが正常に送信され、クライアントが here3 の直後に待機していることがわかります。
私はこれ、特に矛盾をまったく理解していません。pout.println() を out.write() に置き換え、bin.readLine() を in.read() に置き換えた場合、この問題は発生せず、2 つのプログラムが永遠にループします。なぜこれが起こるのか本当に知りたいです!