-2

ソケットを介してサーバーにバイトを書き込み、応答を読み取るテスト ハーネスに取り組んでいます。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 の最終読み取りがすぐに返されるのはなぜですか?

4

1 に答える 1

1

これは信じがたいことです。ソケットのタイムアウトを設定しても、その効果はありません。

最も可能性の高い説明は、何か他のものを変更したことであり、それが一時停止を修正したものだと思います。(私が推測するなら、サーバーが以前はそうしていなかったソケットを閉じている可能性があります。)

これで問題が解決しない場合は、他の人が実行して効果を観察できる SSCCE を提供する必要があります。また、使用しているプラ​​ットフォームを教えてください。

于 2013-07-31T05:33:23.940 に答える