2012-09-04 66 views
2

我有一個CGI腳本,流事件:爲什麼我沒有得到Comet服務器流事件的實時響應?

#!/usr/bin/python 
... 
print 'Content-Type: text/event-stream\n' 

while (True): 
    delay() 
    print 'event: item' 
    print 'data: ' + get_random_event() 
    print '' 

在命令行中,它在隨機時間間隔(每隔幾秒鐘)發送隨機事件。

不過,我有以下的JavaScript:

var source = new EventSource('feed.cgi'); 

source.addEventListener('message', function(current_event) 
    { 
    alert(current_event.data); 
    }, false); 

這從來沒有讓我一個警告。在Chrome瀏覽器JavaScript控制檯中沒有任何錯誤,但到目前爲止,我從來沒有得到明顯的認識,即偵聽服務器腳本的代碼已收到事件。

你對我如何獲得這些建議有什麼建議嗎?

- 編輯 -

我也許應該給第一個CGI腳本完成。 FireFox說:「Firefox無法通過http:// [deleted] /feed.cgi與服務器建立連接。」但是我可以執行通常位於同級目錄中的CGI腳本,並且Apache的最佳粒度目錄設置仍位於兩者的父目錄,並且允許具有.cgi擴展名的腳本作爲CGI運行。並且該腳本設置爲模式0755.

在增加行爲後添加文件刷新似乎不會改變腳本的接收。

#!/usr/bin/python 

import random 
import sys 
import time 

timescale = 5 

names = [ 
    'Adam', 
    'Bob', 
    'Carol', 
    'David', 
    'Eddie', 
    'Frank', 
    'George', 
    'Harry', 
    'Ike', 
    'Jim', 
    'Kenny', 
    'Larry', 
    'Mary', 
    'Nancy', 
    'Oliver', 
    'Peter', 
    'Quincy', 
    'Roger', 
    'Sam', 
    'Thomas', 
    'Uncle', 
    'Vincent', 
    'William', 
    'Xavier', 
    'Yogi', 
    'Zachary', 
    ] 

notifications = [ 
    'applied for a position at ACME.', 
    'went to an interview at ACME.', 
    'accepted an offer from ACME.', 
    ] 

def delay(): 
    time.sleep((random.random() + random.random()) * timescale) 

def get_random_event(): 
    result = '<div class="activity"><span class="name">' 
    result += random.choice(names) 
    result += '</span> ' 
    result += random.choice(notifications) 
    result += '</div>' 
    return result 

print 'Content-Type: text/event-stream\n' 

while (True): 
    print 'event: item' 
    print 'data: ' + get_random_event() 
    print '' 
    sys.stderr.flush() 
    delay() 

回答

0

從我們的代碼和W3chools Server Sent Event documentation起始I構建其成功地運行在chomium和Firefox具有這些修飾的(與lighttpd的)的示例:

  1. 在打印
  2. 的末尾添加一個「\ N」
  3. 沖洗與其使用的標準誤差

標準輸出因此而應該是:

while (True): 
    print 'event: item' + '\n' 
    print 'data: ' + get_random_event() + '\n' 
    print '' 
    sys.stdout.flush() 
    delay() 
相關問題