如何在HTTP文件服务器上正确处理客户端“连接:关闭”请求?

时间:2011-06-01 20:09:13

标签: java http

如何正确处理客户Connection: close请求字段?截至目前,如果我得到这个特定字段,我关闭套接字并等待来自客户端的后续请求,而不是再次回复并开始提供数据。

我不知道为什么我的客户端/服务器通信不能像我测试的Apache服务器一样工作。

感谢您的任何澄清......

客户端/服务器通讯:

CLIENT:
HEAD /stream.mpeg HTTP/1.0
Host: 127.0.0.1
User-Agent: SuperPlayer
Connection: Close

SERVER:
HTTP/1.0 200 OK 
Date: Wed, 1 Jun 2011 20:05:13 GMT
Server: HTTP Server
Last-Modified: Mon, 06 Aug 2009 01:02:23 GMT
Accept-Ranges: bytes
Connection: Close
Content-Type: audio/mpeg

CLIENT:
HEAD /stream.mpeg HTTP/1.0
Host: 127.0.0.1
User-Agent: SuperPlayer
Connection: Close

SERVER:
HTTP/1.0 200 OK 
Date: Wed, 1 Jun 2011 20:05:13 GMT
Server: HTTP Server
Last-Modified: Mon, 06 Aug 2009 01:02:23 GMT
Accept-Ranges: bytes
Connection: Close
Content-Type: audio/mpeg

231489172304981723409817234981234acvass123412323
21312hjdfaoi8w34yorhadl4hi8rali45mhalo3i,wmotw
345fqw354aoicu43yocq2i3hr

客户端/ ApacheServer通信:

CLIENT:
GET /test.mp3 HTTP/1.0
Host: 192.168.1.120
User-Agent: SuperPlayer
Connection: Close

SERVER:
HTTP/1.1 200 OK
Date: Wed, 01 Jun 2011 19:15:11 GMT
Server: Apache/2.2.16 (Win32)
Last-Modified: Thu, 29 Apr 2010 21:06:34 GMT
ETag: "14000000047049-4f75c8-4856680636a80"
Accept-Ranges: bytes
Content-Length: 5207496
Connection: close
Content-Type: audio/mpeg

...d.....<).0.. ..........<.@.. ( .h.$.J...1...i....A. ......c....a.9..!g.N...A. ........ ....>......|.......8....a......|..|N.............'>........?...C.....@..TJt.n .e...r.iL..#..IH...pR|.

4 个答案:

答案 0 :(得分:5)

是关闭套接字是正确的行动。如果客户端正确使用此标头,则一旦收到您的响应,他们就会关闭套接字。

我在这里注意到的是,您的服务器没有返回Content-Length标头。即使客户端发出了HEAD请求,based on the W3C proposal (sec. 9.4)

  

HTTP中包含的元信息   响应HEAD请求的标头   应该与信息完全相同   发送以响应GET请求。   该方法可用于获得   关于实体的元信息   没有提出要求所暗示的   转移实体 - 身体本身。   此方法通常用于测试   有效性的超文本链接,   可访问性,最近   修改。

     

对HEAD请求的响应可能是   可缓存的意思是   回复中包含的信息   可以用来更新以前的   来自该资源的缓存实体。如果   新的字段值表明了   缓存实体与当前不同   实体(由a表示)   Content-Length,Content-MD5的变化,   ETag或Last-Modified),然后是缓存   必须将缓存条目视为陈旧。

这里的关键是确保在不实际发送数据的情况下告诉客户端响应的大小

答案 1 :(得分:4)

Connection:close标头只表示客户端希望您在发送响应后关闭连接这也使您无需发送Content-Length:标头。

答案 2 :(得分:2)

我可以问你为什么在请求中使用http 1.0 ? http 1.0中没有持久连接,因此服务器应该在响应后终止TCP连接,无论您是否发送Connection: close

答案 3 :(得分:2)

如果您使用 HTTP 1.0 ,则没有持久连接,因为 alexrs 指向,而Connection: keep-alive正在与 HTTP 1.0一起使用< / strong>即可。在 HTTP 1.1 上,您不需要它,因为默认情况下HTTP连接在 HTTP 1.1 上是持久的。

  

8.1.2整体操作

     

HTTP / 1.1与早期版本的HTTP之间存在显着差异   是持久连接是任何HTTP的默认行为   连接。也就是说,除非另有说明,否则客户应该这样做   假设服务器将保持持久连接,甚至   来自服务器的错误响应后。

     

持久连接提供了一种客户端和一种机制   服务器可以发出TCP连接的信号。这个信令需要   使用Connection标头字段放置(第14.10节)。一旦收盘   已发出信号,客户端不得再发送任何请求   连接。

您可以查看 HTTP 1.1 RFC ;

RFC for HTTP 1.1