【问题标题】:Http server, when do I send the data?Http 服务器,我什么时候发送数据?
【发布时间】:2011-06-15 12:17:22
【问题描述】:

我已经用 Java 构建了一个文件服务器,但我很难理解何时应该开始提供文件数据。正如您在下面看到的,是两个不同的客户端请求。有些提供了两个请求,我不确定什么时候应该开始提供数据,什么时候应该“忽略”。

客户 #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 

【问题讨论】:

  • 您还应该在客户端记录标题(curl -v)。客户端的行为似乎有点奇怪,因为通常客户端会在每个请求上同时发送用户代理和接受。
  • 我无权访问 http 客户端的内部 :( 这是一个 Android 设备。
  • 顺便说一句:“接受:*/*”大致意思是“向我发送您喜欢的任何内容类型”。 w3c 说:如果不存在 Accept 头字段,则假定客户端接受所有媒体类型。如果存在 Accept 头字段,并且如果服务器无法发送根据组合 Accept 字段值可接受的响应,则服务器应该发送 406(不可接受)响应。
  • 顺便说一下,我添加了另一个客户端请求的新日志捕获。如您所见,它确实包括您所说的用户代理。但是我忽略了 Accept: / 的请求,所以这在我的服务器上造成了很大的问题。我遇到的主要问题是我不知道如何判断何时应该发送数据以及何时应该忽略后续客户请求。
  • @heiko 我稍微修改了一下问题...关于用户代理,是否只发送一次?

标签: android http http-headers


【解决方案1】:

如果您尝试提供音频或视频,则客户端可能会尝试利用 HTTP's Range header。 Range 标头允许诸如跳到音频/视频流的中间、擦洗等功能。桌面浏览器通常发出几个请求,一个是为了发现 Range 标头是否受支持,另一个是实际开始流式传输内容的请求。只要您的服务器可以处理客户端终止套接字连接,您就可以安全地开始为每个连接流式传输内容。

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

【讨论】:

  • 好吧,如果这听起来很荒谬,我不能倒回数据。一旦请求开始,我就会开始提供实时内容。我想我必须设法适应你所说的不满足所有请求
  • 让我问你这个。你认为我应该开始为第一个有效请求提供服务,而任何后续请求都不提供数据吗?
  • 您要提供什么样的数据?它是文件系统上的文件吗?
  • 这个服务器处理来自无线电广播的实时数据。它处理数据并将其提供给请求的客户。您是否认为如果我看到 User-Agent 字段,可以安全地假设我可以开始服务,并且任何后续客户端证明请求都不会包含 User-Agent 字段,所以我会忽略此类请求。
  • 我可能会使用推送模型。跟踪所有打开的请求。将实时数据读入缓冲区。当缓冲区已满时,将数据写入每个打开的请求。
猜你喜欢
  • 2019-08-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-11-28
  • 2012-09-24
相关资源
最近更新 更多