2

PrintWriter(out.write(String str)) を介してテキスト データを送信するソケット プログラムがあり、反対側では BufferedReader(in.readLine()) がこれを受信して​​います。

クライアントの1つが接続を切断した場合、ある種の「タイムアウト」でプログラムを保護したいのですが、テストし、作業中にクライアントがオフになると、サーバーはまだデータを送信しており、中断もソケットの閉鎖もありません。

クライアントの場合も同様です。接続を切断して、「サーバーが機能していません」などの情報を表示したい。どうすればこれを処理できますか?

// Server
out = new PrintWriter( sock.getOutputStream());
while( true ) {
   this.out.write("Hello");
   this.out.flush();
}

// Client
in = new BufferedReader( new InputStreamReader( sock.getInputStream()));
while (true) {
   in.readLine();
}
4

2 に答える 2

2

あなたの問題はPrintWriterだと思います。そのドキュメントを参照してください:

このクラスのメソッドが I/O 例外をスローすることはありませんが、一部のコンストラクターは例外をスローする可能性があります。クライアントは、checkError() を呼び出して、エラーが発生したかどうかを問い合わせることができます。

代わりにBufferedWriterを使用してください。

java.util.Scanner にも同じ問題があることに注意してください (サーバー側で使用している場合)

于 2012-12-01T18:08:54.630 に答える
1

チェックしたところ、PrintWriter.checkError()メソッドが問題の解決に役立ちました。クライアントが接続を切断すると、メソッドは true を返しました。説明が言うように:Flushes the stream if it's not closed and checks its error state.

// Server
this.out = new PrintWriter(sock.getOutputStream());
while (true) {
   this.out.write("Hello");
   this.out.flush();
   if(this.out.checkError()){
      //...
   }
}
于 2012-12-01T18:27:51.747 に答える