我有一个C应用程序,它使用server-sent-events生成我想要推送到网站的数据。
我在C中实现了一个基本的Web服务器,它在收到Http请求后发送Http-Header,然后通过套接字以1秒的间隔发送数据。
我将我的套接字注册为Event-Source并且我正在传输正确的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
答案 0 :(得分: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定义为行尾标记 除了entity-body
之外的所有协议元素
您的示例只使用\n
,因此标题可能看起来都是一行简单http客户端的一部分。尝试使用\r\n
答案 1 :(得分:2)
在chunked
编码中,每个数据块前面都有一行描述块的大小。您未显示提供此尺寸,因此您的活动数据不符合chunked
编码格式。
长度以十六进制指定,因此在您的情况下,18字节的数据将以十六进制编码为12
。如果没有更多的块(即响应完成),则会发送0
大小的块。
许多客户端将接受普通\n
作为正确的数据单元终结符,但HTTP RFC指定使用\r\n
。因此,标头中的每个\n
都应更改为\r\n
。你的块应该是这样的:
12\r\ndata: Testdata...\n\r\n
HTTP应用程序的一般规则是:对你所接受的内容持开放态度,对你发送的内容保守。此规则意味着您应编写应用程序以容忍对规范的宽松解释,但严格按照规范提供数据。