我目前正在开发一个简单的代理服务器,它接收来自浏览器的http请求,处理它,然后将其转发到所需的Web服务器。
我尝试从浏览器连接的套接字的输入流中获取请求,一切都很好,除了流在收到最后一个数据块后卡住了。
我的代码实际上非常简单,如下所示:
ServerSocket servSocket = new ServerSocket(8282);
Socket workSocket = servSocket.accept();
InputStream inStream = workSocket.getInputStream();
byte[] buffer = new byte[1024];
int numberRead = 0;
while ((numberRead = inStream.read(buffer, 0, 1024)) != -1){
System.out.println(new String(buffer));
}
即使请求接收完成,循环也无法退出。
有没有办法解决这个问题?
提前感谢任何建议。
答案 0 :(得分:1)
与InputStream javadoc一样,该方法将阻塞,直到数据可用或遇到EOF。所以,Socket的另一面需要关闭它 - 然后inStream.read()调用将返回。
另一种方法是先发送您想要读取的消息大小,这样您就知道需要读取多少字节。或者您可以使用BufferedReader以行方式从套接字读取。 BufferedReader有一个方法readLine(),它在每次读取一行时都会返回,这对你来说很有用,因为HTTP协议包很好地分成几行。
答案 1 :(得分:0)
它将循环直到连接关闭,客户端可能正在等待您的HTTP响应,并且不会关闭它。
答案 2 :(得分:0)
浏览器在关闭连接之前正在等待响应。 另一方面,您的读取方法将阻塞,直到关闭流/连接或接收到新数据。
答案 3 :(得分:0)
根据您当前的代码,不是直接的解决方案。
由于HTTP是基于行的协议,您可能需要使用Buffered Reader并在其上调用readLine()
。
答案 4 :(得分:0)
当http请求进入时,总是以空行结束,例如:
GET /someFile.html HTTP/1.1
Host: www.asdf.com
发送该请求后,客户端连接将在关闭连接之前等待服务器的响应。因此,如果您想解析来自用户的请求,您可能最好使用BufferedReader并读取完整行,直到您到达一行空行的文本行。