我想用socket发出http请求,因为我想测试一下我可以创建服务器的套接字数。所以我使用OutputStream
和InputStream
从我的服务器上编写和阅读。但是在第一次响应之后我无法再次从输入流中读取。你知道如何在不关闭插座的情况下阅读第二个响应吗?
这是我的代码:
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();
感谢。
答案 0 :(得分:1)
我认为HTTP标准是在每次响应后关闭连接,除非请求具有Connection header set to keep-alive。
答案 1 :(得分:1)
IOUtils.toString(InputStream)
将流读取到EOS,因此下次无法读取任何内容。不要使用它。您需要解析响应头,确定是否有Content-Length头,如果是这样,请读取正确的那个字节;如果没有Content-Length标头(并且没有分块),则在主体之后关闭连接,因此您无法发送第二个命令;等等等。这是无止境的。不要使用Socket
:使用HTTP URL
和URLConnection.