HttpURLConnection は永続的な接続をサポートしているため、接続を複数のリクエストで再利用できることを読みました。私はそれを試してみましたが、2 番目の POST を送信する唯一の方法は、openConnection をもう一度呼び出すことでした。それ以外の場合、IllegalStateException("Already connected"); が発生しました。私は以下を使用しました:
try{
URL url = new URL("http://someconection.com");
}
catch(Exception e){}
HttpURLConnection con = (HttpURLConnection) url.openConnection();
//set output, input etc
//send POST
//Receive response
//Read whole response
//close input stream
con.disconnect();//have also tested commenting this out
con = (HttpURLConnection) url.openConnection();
//Send new POST
2 番目の要求は同じ TCP 接続を介して送信されます (wireshark で検証済み) が、disconnect を呼び出したので理由がわかりません (ただし、これが必要です)。HttpURLConnection のソース コードを確認したところ、実装によって同じ宛先への接続のキープアライブ キャッシュが保持されます。私の問題は、最初のリクエストを送信した後、接続がどのようにキャッシュに戻されるかを確認できないことです。切断すると接続が閉じられますが、切断がなければ、接続がキャッシュにどのように戻されるかわかりません。キャッシュにはすべてのアイドル接続を通過する run メソッドがあることがわかりました (どのように呼び出されるかはわかりません) が、接続がキャッシュに戻される方法がわかりません。発生しているように見える唯一の場所は httpClient の finished メソッドにありますが、これは応答のある POST では呼び出されません。誰でもこれについて私を助けることができますか?
EDIT 私の興味は、tcp接続の再利用のためのHttpUrlConnectionオブジェクトの適切な処理は何ですか。入力/出力ストリームを閉じる必要があり、その後に url.openConnection(); が続きます。新しいリクエストを送信するたびに(disconnect()を回避)?はいの場合、接続が最初のリクエストのキャッシュから削除され、返される方法を見つけることができないため、2 回目に url.openConnection() を呼び出したときに、接続がどのように再利用されているかを確認できません。接続がキープアライブ キャッシュに返されない可能性はありますか (バグ?)、OS は tcp 接続をまだ解放しておらず、新しい接続では、OS はバッファリングされた接続 (まだ解放されていません) を返しますか? EDIT2 私が見つけた唯一の関連はJDK_KeepAliveからのものでした
... アプリケーションが URLConnection.getInputStream() によって返された InputStream で close() を呼び出すと、JDK の HTTP プロトコル ハンドラは接続をクリーンアップしようとし、成功した場合は、将来の HTTP リクエストで再利用できるように接続を接続キャッシュに入れます。 .
しかし、これがどのハンドラーであるかはわかりません。私が見たように、sun.net.www.protocol.http.Handler はキャッシュを行いません ありがとう!