Java套接字编程 - 流卡住

时间:2010-03-03 10:23:39

标签: java browser sockets proxy-server

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

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

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

提前感谢任何建议。

5 个答案:

答案 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并读取完整行,直到您到达一行空行的文本行。