2013-07-08 36 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 –

相關問題