我正在从套接字的输入流中读取并且从不接收流信号的结束。我正在阅读浏览器发出的HTTP请求。见下面的例子。
我怎么知道没有其他内容可供阅读?
POST /hello?a=b HTTP/1.1
Host: 127.0.0.1:4444
Connection: keep-alive
Content-Length: 0
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_9_3) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/36.0.1985.125 Safari/537.36
Origin: null
Accept: */*
Accept-Encoding: gzip,deflate,sdch
Accept-Language: en-US,en;q=0.8,he;q=0.6
答案 0 :(得分:2)
请求正在使用HTTP 1.1,并且具有(1.1中的冗余)Connection: keep-alive
标头。如果响应不包含Connection: close
标头,则服务器将在发送响应后不关闭连接。这就是HTTP keep-alive的工作方式(参见RFC 2616 Section 8 "Connections")。客户端必须查看响应头以确定如何读取响应主体并确定响应何时结束(请参阅RFC 2616 Section 4.4 "Message Length"),然后决定是否关闭连接。不要依赖于流末尾信号,这不是HTTP的工作方式。
更新:我刚刚意识到您正在编写服务器,而不是客户端。 RFC 2616 Section 4.4也适用于阅读请求。客户端将首先发送标头,这些标头由"\r\n\r\n"
序列终止,然后标头描述请求主体的格式化和终止方式,这允许服务器读取主体直到请求结束。
答案 1 :(得分:0)
唯一的"流结束"指示TCP可以提供关闭连接。
如果连接保持打开状态,则TCP无法告诉您"那就是它!",因为TCP是面向流的,而不是面向消息的。
因此,是否有更多的阅读只能在应用程序(协议)级别决定。
在这种情况下,应用程序协议是http。如果您通过收到\r\n\r\n
(看起来像)收到了标题,它可能会告诉您通过此行预计会有多少数据:
Content-Length: 0
事实上,它告诉你这个请求有0
个字节。