1

JAVA ベースのコメット HTTP ストリーミングを作成しようとしています。これにはApache httpClient 4.xを使用しています。これはコメット HTTP ストリーミングであるため、すべてのイベントはチャンク データの形式でクライアントに送信されます。接続が長時間開いたままになる可能性があるため、サーバーからの readLine() データの後に SO_TIMEOUT の動的設定を実装しようとしています。

BufferedInputStream から readLine の後に SO_TIMEOUT の値を設定すると、有効になりません。execute() メソッド呼び出しの前に設定された元の SO_TIMEOUT 値が引き続き使用されます。

以下は、Apache Web サイトからの SO_TIMEOUT の定義です。 ソケット タイムアウト (SO_TIMEOUT) をミリ秒単位で定義します。これは、データを待機するためのタイムアウト、または別の言い方をすれば、2 つの連続するデータ パケット間の最大非アクティブ期間です)。ゼロのタイムアウト値は、無限のタイムアウトとして解釈されます。

上記の定義に従って、SO_TIMEOUT 値は、すべてのチャンク データの到着時に apache httpclient によってリセットされる必要があります。その場合は、新しい SO_TIMEOUT 値を受け入れる必要があります。BufferedInputStream から数行を読み取った後に SO_TIMEOUT 値を設定する方法について何か考えはありますか?

4

3 に答える 3

2

上記の定義に従って、SO_TIMEOUT 値は、すべてのチャンク データの到着時に apache httpclient によってリセットされる必要があります。

著者が意図したものではない、引用された javadoc に意味を読み取っていると思います。応答ストリームの読み取り中にタイムアウトを動的に調整できるという意味で、テキストを読みません。

実際、 のコードを調べてsetSoTimeout()パラメーターが使用されている場所をたどると、HTTP メソッドを作成しようとしているときにのみ値が使用されることが明らかです。それ以降に行われた変更は、現在のリクエストまたはレスポンスの処理方法には影響しません。を探しHttpMethodDirector.applyConnectionParamsます。

BufferedInputStream から数行を読み取った後に SO_TIMEOUT 値を設定する方法について何か考えはありますか?

最善の策は、HttpConnection クラスを拡張して、接続のソケットの SO_Timeout を変更するメソッドを追加することだと思います。

于 2010-11-02T02:30:26.053 に答える
0

HttpConnection.setSocketTimeout。'基になるソケットに直接SO_TIMEOUT値を設定します。' これは、基になるソケットでの次のブロッキング読み取りで有効になります。もちろん、その周りにBufferedInputStreamがあり、すでにデータが含まれている場合は、それを使い果たすまでまったくブロックされません。

于 2010-11-02T06:54:27.997 に答える
0

HttpConnection オブジェクトを呼び出しopen()た後は、HttpConnectionParams への変更は反映されないと思います。HttpConnectionのJavadocを見てください。それは言います:

open() メソッドで入出力ストリームを取得するに、次のオプションがソケットに設定されます。

...
Socket.setSoTimeout(int) SO_TIMEOUT HttpConnectionParams.setSoTimeout(int)
...

于 2010-11-02T02:21:36.083 に答える