2013-07-08 35 views
3

我有一个C应用程序,用于生成要使用服务器发送的事件推送到网站的数据。通过C中的套接字发送Server-Sent-Events 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 
+0

你可以提供一些关于如何发送sse的C代码部分的例子吗?我对此很好奇,我正在寻找一些与之相关的例子。谢谢! – Jun

回答

2

chunked编码中,每个数据块前面都有一条描述块大小的行。您不会显示您提供此尺寸,因此您的活动数据不会遵循chunked编码格式。

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

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

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

的一般规则的HTTP应用程序是:要开放你接受什么样的,是保守的你送什么。此规则意味着您应该编写您的应用程序以容忍对规范的宽松解释,但严格遵循规范提供数据。

+0

头部是否应该包含大小?我使用线鲨鱼,我看到它也指定了开始时的长度。另外,还有一个零大小的结束块? – Timtianyang

+0

@Timtianyang:使用'chunked'编码时,不需要'Content-Length'。是的,正如答案中所述,终止块大小为'0'。 – jxh

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

+2

也在HTTP头的最后一行之后。它应该以“\ r \ n”2次结尾 –

+0

@DennyMathew看起来这样做是正确的(参见问题中Content-Type标题后面的行中的\ n) – simonc

+0

,, oh k ..只是做了一个断言... tnx –

相关问题