ここにはクライアント/サーバーのフローがあります。閉じた出力ストリームへのJavaの書き込みでioexceptionをスローしない
ソケットはメインスレッドで作成されます。
- ソケットは1
- クライアントが
- サーバーがクライアントに応答し、サーバにデータを送信するスレッドに渡し
- Serverは、ソケットがメインに戻っ
close()
- 起動することにより、入力ストリーム、出力ストリーム、およびソケットをクローズスレッド2に渡されます。
- クライアントはサーバにデータを書き込みます - 例外もエラーもなく、サーバはデータを取得しません
- クライアントのデータ読み取り試行 - 例外なし、エラーなし
ソケットが閉じられた問題を検出するにはどうすればよいですか?
try {
os = new DataOutputStream(this.socket.getOutputStream());
os.write(data);
os.flush();
System.out.println("Written " + data.length + " bytes");
} catch (IOException e) {
System.out.println("Client failed to write to stream");
System.out.println(e.getMessage());
e.printStackTrace();
}
例外はスローされません。それはWritten 60 bytes
と言います。何か案は?
ここでUPDATE
は私が応答を読む方法です。私はデータを待って、最初の4バイト(応答の長さを与える)を読み取り、指定された長さを読むまで読み取りを続けます。このループはデータが一度も来ないので終了しません。
is = new DataInputStream(this.socket.getInputStream());
while(true){
while(is.available() > 0){
bos.write(is.read());
}
if(contentLength == 0 && bos.size() > 3){
byte[] bytes = bos.toByteArray();
byte[] size = Arrays.copyOf(bytes, 4);
contentLength = ByteBuffer.wrap(size).getInt();
}
if(bos.size() - 4 < contentLength){
continue;
}
break;
}
あなたはSocketExceptionをチェックしましたか?あなたがすべてを閉じているなら、それもそれを投げ捨てるべきです。 –
はい、例外はスローされません。スレッド間で渡されるソケットに関する追加情報で質問を更新しました –
ブロックされていない閉じたストリームから何バイト読み込めますか?なし。したがって、 'available()'はゼロを返さなければなりません。 – erickson