0

サーバーを作成できるソケットの数をテストしたいので、ソケットを使用して http 要求を作成します。そのため、 と を使用してサーバーから書き込みと読み取りをOutputStream行いInputStreamます。しかし、最初の応答の後、入力ストリームから再度読み取ることはできません。ソケットを閉じずに 2 番目の応答を読み取る方法を知っていますか?
これが私のコードです:

Socket socket = new Socket();
socket.connect(new InetSocketAddress(address, 80), 1000);
socket.setSoTimeout(25*1000);

OutputStream os = socket.getOutputStream();        
os.write(getRequest(host)); // some request as bytearray, it has Connection: Keep-Alive in the header
os.flush();

InputStream is = socket.getInputStream();
BufferedInputStream bis = new BufferedInputStream(is);

String response = IOUtils.toString(bis);
System.out.println("RESPONSE = \n" + response); // this works fine

os.write(getRequestBodyBa()); // send another request, i can see it sent to server with wireshark
os.flush();

// try to read again but it always return empty string            
response = IOUtils.toString(bis); // how to read the second response?????
System.out.println("RESPONSE = \n" + response);        

os.close();
is.close();
socket.close();

ありがとう。

4

2 に答える 2

1

IOUtils.toString(InputStream)ストリームをEOSに読み取るため、次回のために読み取るものが残っていることはありません。使用しないでください。応答ヘッダーを解析し、Content-Lengthヘッダーがあるかどうかを確認する必要があります。ある場合は、本文を正確にその数バイト読み取ります。Content-Lengthヘッダーがない場合(およびチャンクがない場合)、接続は本文の後で閉じられるため、2番目のコマンドを送信できません。などなどなど。それは無限大です。これにもを使用しないでくださいSocket。HTTPURLを使用してURLConnection.

于 2013-03-06T03:10:13.007 に答える
1

リクエストでConnectionヘッダーがkeep-aliveに設定されていない限り、HTTP標準では各応答の後に接続を閉じると思います。

于 2013-03-05T17:06:39.100 に答える