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

标签 javascript ajax html comet

我有一个流式传输事件的 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 中成功运行:

  1. 在打印末尾添加'\n'
  2. 刷新标准输出而不是标准错误

所以 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/

相关文章:

javascript - 通过ajax过滤列表并请求数据

php - 在 php 中,如何获取 XMLHttpRequest 的 send() 方法的文本/纯文本值

javascript - Angularjs View 不更新,单击按钮时 View 闪烁

javascript - D3Js 使用调用更新错误的元素

javascript - 可以在 React Native 中检测到 View 组件的触摸吗?

javascript - .click() 回调函数解释

javascript - jQuery 2 ajax 请求一个 onClick

javascript 在现代浏览器中不是按顺序执行的?

css - 链接 rel ="preload"究竟是如何工作的?

javascript - Uncaught ReferenceError : say is not defined