1

我目前正在开发一个简单的代理服务器,它从浏览器接收 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));  
}  

即使请求接收完成,循环也无法退出。

有没有办法解决这个问题?

提前感谢您的任何建议。

4

5 回答 5

1

InputStream javadoc中一样,该方法将阻塞,直到数据可用或遇到 EOF。因此,Socket 的另一端需要关闭它——然后 inStream.read() 调用将返回。

另一种方法是先发送您想要读取的消息大小,这样您就知道必须读取多少字节。或者您可以使用 BufferedReader 以逐行方式从套接字读取。BufferedReader 有一个 readLine() 方法,它在每次读取一行时返回,这应该对你有用,因为 HTTP 协议包很好地分为行。

于 2010-03-03T10:55:39.147 回答
0

当一个 http 请求进来时,它总是以一个空行结束,例如:

GET /someFile.html HTTP/1.1
Host: www.asdf.com

发送该请求后,客户端连接将在关闭连接之前等待来自服务器的响应。因此,如果您想解析来自用户的请求,您最好使用 BufferedReader 并阅读整行,直到您到达空白行的文本行。

于 2010-03-03T13:50:19.647 回答
0

它将循环直到连接关闭,并且客户端可能正在等待您的 HTTP 响应并且不会关闭它。

于 2010-03-03T10:52:29.537 回答
0

浏览器在关闭连接之前正在等待响应。另一方面,您的读取方法将阻塞,直到关闭流/连接或接收到新数据。

于 2010-03-03T11:00:34.530 回答
0

根据您当前的代码,这不是直接的解决方案。

由于 HTTP 是基于行的协议,您可能希望使用Buffered Reader并调用readLine()它。

于 2010-03-03T11:03:42.757 回答