我有一个流式传输事件的 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 Server Sent Event documentation开始我构建了一个示例,通过这些修改(使用 lighttpd)在 chomium 和 firefox 中成功运行:
- 在打印末尾添加'\n'
- 刷新标准输出而不是标准错误
所以 while 应该是:
while (True):
print 'event: item' + '\n'
print 'data: ' + get_random_event() + '\n'
print ''
sys.stdout.flush()
delay()
关于javascript - 为什么我没有得到对 Comet 服务器流事件的实时响应?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12267120/