3

我有一个 C 应用程序,它产生我想使用服务器发送事件推送到网站的数据。

我在 C 中实现了一个基本的 Web 服务器,它在接收到 Http 请求后发送 Http-Header,然后以 1 秒的间隔通过套接字发送数据。

我将我的套接字注册为事件源,并且我正在传输正确的 HTTP 标头(根据 Firebug),但由于某种原因未调用 eventListener。

var source = new EventSource('http://192.168.2.113:10001/'); 

source.addEventListener('message', function(e) {
/* */
}, false); 

我尝试从 php 应用程序发送事件,它没有任何问题,所以猜测问题不在 javascript 端。

当我刚刚http://192.168.2.113:10001/在浏览器中打开时,会显示我以 1 秒为间隔发送的数据字符串。

我只找到了使用 php 或 cgi 的 sse 实现,我不想使用它们。

我的回复标题:

HTTP/1.1 200 OK\n
Date: Fri, 05 Jul 2013 15:05:15 GMT\n
Cache-Control: no-cache\n
Connection: Keep-Alive\n
Transfer-Encoding: chunked\n
Content-Type: text/event-stream\n
\n

事件数据:

data: Testdata...\n\n
4

2 回答 2

3

chunked编码中,每个数据块前面都有一行描述块的大小。您没有表明您正在提供此大小,因此您的事件数据不遵循chunked编码格式。

长度以十六进制指定,因此在您的情况下,18 个字节的数据将被编码为12十六进制。当没有更多的块时(即响应完成),则0发送一个大小合适的块。

许多客户端将接受一个普通\n的作为适当的数据单元终止符,但 HTTP RFC 指定\r\n使用它。因此,\n标题中的每个都应更改为\r\n. 你的块应该是这样的:

12\r\ndata: Testdata...\n\r\n

HTTP 应用程序的一般规则是:对您接受的内容保持自由,对您发送的内容保持保守。此规则意味着您应该编写应用程序以容忍对规范的松散解释,但提供严格遵循规范的数据。

于 2013-07-08T14:56:10.873 回答
2

HTTP 标头中的每一行都需要使用\r\n.

rfc2616第 2.2 节基本规则

   CR             = <US-ASCII CR, carriage return (13)>
   LF             = <US-ASCII LF, linefeed (10)>

HTTP/1.1 将序列 CR LF 定义为除实体主体之外的所有协议元素的行尾标记

您的示例只是使用\n,因此对于某些简单的 http 客户端,标头似乎都是单行的一部分。尝试更改为结束不属于实体的每一行\r\n

于 2013-07-08T14:41:43.357 回答