HTTP 1.1 を使用してサーバーで HTTP 要求を行い、接続を閉じない Java プログラムがあるとします。1 つの要求を作成し、ソケットにバインドした入力ストリームから返されたすべてのデータを読み取ります。ただし、2 番目の要求を行うと、サーバーから応答がありません (または、ストリームに問題があり、それ以上入力が提供されません)。リクエストを順番に(リクエスト、リクエスト、読み取り)行うと正常に機能しますが、(リクエスト、読み取り、リクエスト、読み取り)は機能しません。
なぜこれが起こっているのかについて、誰かが洞察を与えることができますか? (コード スニペットが続きます)。何をしても、2 番目の読み取りループの isr_reader.read() は -1 しか返しません。
try{
connection = new Socket("SomeServer", port);
con_out = connection.getOutputStream();
con_in = connection.getInputStream();
PrintWriter out_writer = new PrintWriter(con_out, false);
out_writer.print("GET http://somesite HTTP/1.1\r\n");
out_writer.print("Host: thehost\r\n");
//out_writer.print("Content-Length: 0\r\n");
out_writer.print("\r\n");
out_writer.flush();
// If we were not interpreting this data as a character stream, we might need to adjust byte ordering here.
InputStreamReader isr_reader = new InputStreamReader(con_in);
char[] streamBuf = new char[8192];
int amountRead;
StringBuilder receivedData = new StringBuilder();
while((amountRead = isr_reader.read(streamBuf)) > 0){
receivedData.append(streamBuf, 0, amountRead);
}
// Response is processed here.
if(connection != null && !connection.isClosed()){
//System.out.println("Connection Still Open...");
out_writer.print("GET http://someSite2\r\n");
out_writer.print("Host: somehost\r\n");
out_writer.print("Connection: close\r\n");
out_writer.print("\r\n");
out_writer.flush();
streamBuf = new char[8192];
amountRead = 0;
receivedData.setLength(0);
while((amountRead = isr_reader.read(streamBuf)) > 0 || amountRead < 1){
if (amountRead > 0)
receivedData.append(streamBuf, 0, amountRead);
}
}
// Process response here
}
質問への回答: はい、サーバーからチャンクされた回答を受信しています。外部の制限により、生のソケットを使用しています。
コードがごちゃごちゃしていて申し訳ありません - 私は記憶から書き直していたので、いくつかのバグを導入したようです。
したがって、コンセンサスは、(要求、要求、読み取り) を実行して、最後に到達したらサーバーにストリームを閉じさせるか、または (要求、読み取り、要求、読み取り) を実行した場合、ストリームの最後に到達する前に停止する必要があるということです。ストリームが閉じないようにします。