ソケットを介してサーバーにバイトを書き込み、応答を読み取るテスト ハーネスに取り組んでいます。Socket の InputStream の最後の読み取りが 20 秒間一時停止するという問題がありました。私はそれを修正しましたが、なぜそれが機能したのかわかりません。
次のメソッドには、java.net.SocketInputStream が与えられます。read(byte[], int, int)の呼び出しは、ストリームの終わりを示す -1 を返す最後の読み取りで 20 秒間一時停止していました。
private String getResponse(InputStream in) throws IOException {
StringBuffer buffer = new StringBuffer();
ByteArrayOutputStream bout = new ByteArrayOutputStream();
byte[] data = new byte[1024];
int bytesRead = 0;
while (bytesRead >= 0) {
bytesRead = in.read(data, 0, 1024); // PAUSED HERE ON LAST READ
if (bytesRead > 0) {
bout.write(data, 0, bytesRead);
}
buffer.append(new String(data));
}
return buffer.toString();
}
ソケットに SO_TIMEOUT を設定することで、一時停止を解消できました。何に設定しても問題ないようです。socket.setSoTimeout(60000)でも、上記のメソッドで読み取った問題は、ストリームの終わりですぐに戻ります。
ここで何が起こっているのですか?SO_TIMEOUT を高い値に設定しても、SocketInputStream の最終読み取りがすぐに返されるのはなぜですか?