2011-06-15 55 views
0

我已经用Java构建了一个文件服务器,并且在理解何时应该开始提供文件数据方面遇到困难。正如你在下面看到的是两个不同的客户端请求。有些提供了两个请求,我不知道什么时候应该开始提供数据,什么时候我应该“忽略”。Http服务器,我什么时候发送数据?

客户端#1:

06-15 08:06:21.290: VERBOSE/HttpSession(9425): SESSION 1: STARTED 
06-15 08:06:21.290: INFO/HttpSession(9425): CLIENT: 
06-15 08:06:21.290: INFO/HttpSession(9425): GET /stream HTTP/1.1 
06-15 08:06:21.290: INFO/HttpSession(9425): Host: 127.0.0.1:37914 
06-15 08:06:21.290: INFO/HttpSession(9425): User-Agent: (Linux) 
06-15 08:06:21.290: INFO/HttpSession(9425): SERVER: 
06-15 08:06:21.290: INFO/HttpSession(9425): HTTP/1.1 200 OK 
06-15 08:06:21.290: INFO/HttpSession(9425): Date: Wed, 15 Jun 2011 12:06:21 GMT 
06-15 08:06:21.290: INFO/HttpSession(9425): Server: HTTP Server 
06-15 08:06:21.290: INFO/HttpSession(9425): Last-Modified: Mon, 06 Aug 2009 01:02:23 GMT 
06-15 08:06:21.290: INFO/HttpSession(9425): Accept-Ranges: none 
06-15 08:06:21.290: INFO/HttpSession(9425): Content-Type: audio/mpeg 
06-15 08:06:21.290: INFO/HttpSession(9425): 
06-15 08:06:26.720: VERBOSE/HttpSession(9425): SESSION 2: STARTED 
06-15 08:06:26.730: INFO/HttpSession(9425): CLIENT: 
06-15 08:06:26.730: INFO/HttpSession(9425): GET /stream HTTP/1.1 
06-15 08:06:26.730: INFO/HttpSession(9425): Host: 127.0.0.1:37914 
06-15 08:06:26.730: INFO/HttpSession(9425): Accept: */* 
06-15 08:06:26.730: INFO/HttpSession(9425): SERVER: 
06-15 08:06:26.730: INFO/HttpSession(9425): HTTP/1.1 200 OK 
06-15 08:06:26.730: INFO/HttpSession(9425): Date: Wed, 15 Jun 2011 12:06:26 GMT 
06-15 08:06:26.730: INFO/HttpSession(9425): Server: HTTP Server 
06-15 08:06:26.730: INFO/HttpSession(9425): Last-Modified: Mon, 06 Aug 2009 01:02:23 GMT 
06-15 08:06:26.730: INFO/HttpSession(9425): Accept-Ranges: none 
06-15 08:06:26.730: INFO/HttpSession(9425): Content-Type: audio/mpeg 
06-15 08:06:26.730: INFO/HttpSession(9425): 
06-15 08:06:26.730: VERBOSE/HttpSession(9425): SESSION 2: ENDED 

客户#2:

06-15 05:03:58.079 I/HttpSession(18335): CLIENT: 
06-15 05:03:58.079 I/HttpSession(18335): GET /stream HTTP/1.1 
06-15 05:03:58.079 I/HttpSession(18335): Host: 127.0.0.1 
06-15 05:03:58.079 I/HttpSession(18335): Accept: */* 
06-15 05:03:58.079 I/HttpSession(18335): Icy-MetaData:1 
06-15 05:03:58.079 I/HttpSession(18335): User-Agent: QuickTime;NvMM HTTP Client v0.1 
06-15 05:03:58.089 I/HttpSession(18335): SERVER: 
06-15 05:03:58.089 I/HttpSession(18335): HTTP/1.1 200 OK 
06-15 05:03:58.089 I/HttpSession(18335): Date: Wed, 15 Jun 2011 09:03:58 GMT 
06-15 05:03:58.089 I/HttpSession(18335): Server: HTTP Server 
06-15 05:03:58.089 I/HttpSession(18335): Last-Modified: Mon, 06 Aug 2009 01:02:23 GMT 
06-15 05:03:58.089 I/HttpSession(18335): Accept-Ranges: bytes 
06-15 05:03:58.089 I/HttpSession(18335): Content-Type: audio/mpeg 
+0

您也可以在客户端记录标题(curl -v)。客户行为似乎有点奇怪,因为通常客户端在每个请求上都发送User-Agent和Accept。 – heiko 2011-06-15 12:50:08

+0

我没有访问http客户端的内部:(这是一个Android设备 – Jona 2011-06-15 12:56:19

+0

)“接受:\ */\ *”大致的意思是“给我发送任何你喜欢的内容类型”w3c说:如果不存在Accept头字段,则假定客户端接受所有媒体类型,如果存在Accept头字段,并且服务器无法根据组合的Accept字段值发送可接受的响应,那么服务器应该(SHOULD)发送一个406(不可接受)的响应 – heiko 2011-06-15 12:57:48

回答

0

如果你想成为音频或视频很可能是客户端试图利用HTTP's Range header 。 Range头部允许像跳到音频/视频流的中间,清理等功能。桌面浏览器通常会发出几个请求,其中一个发现是否支持Range报头以及实际开始流式传输内容的进一步请求。只要您的服务器可以处理客户端终止套接字连接,您可能就可以安全地为每个连接开始流式传输内容。

如果你有兴趣,你可以看看Brisket - 它是一个轻量级的,基于Java的HTTP服务器,支持Range头部。

+0

好吧,事件如果听起来很荒谬,我不能倒带数据。一旦请求开始,我就会放弃提供实时内容。我想我必须设法适应你所说的关于没有任何要求的服务 – Jona 2011-06-15 13:21:37

+0

让我问你这个问题。您是否认为我应该开始投放第一个有效请求,并且任何后续请求都不会提供数据? – Jona 2011-06-15 13:29:39

+0

你想要提供什么样的数据?它是文件系统上的文件吗? – johnstok 2011-06-15 13:48:34