为什么我没有得到对Comet服务器流事件的实时响应

Why am I not getting a live response to Comet server stream events?

本文关键字:服务器 事件 响应 实时 Comet 为什么      更新时间:2023-09-26

我有一个流式传输事件的CGI脚本:

#!/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()

从我们的代码和W3chools服务器发送事件文档开始,我构建了一个在chomium和firefox中成功运行的示例,并进行了以下修改(使用lighttpd):

  1. 在打印结束时添加"''n"
  2. 清除标准输出而不是标准错误

所以时间应该是:

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