我有一个 C 应用程序,它生成我想使用服务器发送事件推送到网站的数据。
我在 C 中实现了一个基本的 Web 服务器,它在收到 Http 请求后发送 Http-Header,然后通过套接字以 1 秒的间隔发送数据。
我将我的套接字注册为事件源并且我正在传输正确的 HTTP header (根据 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
最佳答案
在 chunked
编码中,每个数据 block 前面都有一行描述 block 的大小。您没有表明您提供的是这个大小,因此您的事件数据不遵循 chunked
编码格式。
长度以十六进制指定,因此在您的情况下,18 个字节的数据将以十六进制编码为 12
。当没有更多 block (即响应完成)时,将发送一个 0
大小的 block 。
许多客户端会接受纯 \n
作为适当的数据单元终止符,但 HTTP RFC 指定使用 \r\n
。因此, header 中的每个 \n
都应更改为 \r\n
。你的 block 应该是这样的:
12\r\ndata: Testdata...\n\r\n
HTTP 应用程序的一般规则是:对您接受的内容开放,对您发送的内容保守。此规则意味着您应该编写应用程序以容忍对规范的松散解释,但交付的数据应严格遵守规范。
关于c - 通过 C 中的套接字发送 Server-Sent-Events,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17529421/