使用Ruby Sinatra实现HTML5服务器发送事件

18
我是新手Ruby和Sinatra,我正在尝试使用它设置一个简单的HTML5服务器发送事件。下面的代码在Chrome开发人员版中运行良好,但在非开发人员版和Windows7和OSX上的Safari中失败。
浏览器控制台中的错误消息为“Failed to load resource: cancelled”。
 var source = new EventSource('pull');
        source.addEventListener('message', function(e) {
            console.log(e.data);

        }, false);

        source.addEventListener('open', function(e) {
            // Conn open
        }, false);

        source.addEventListener('error', function(e) {
            if (e.eventPhase == EventSource.CLOSED) {
                // Connection was closed.
            }
        }, false);

使用下面的Sinatra路由:

get '/pull' do
   content_type 'text/event-stream'
   newevent   = false
   response = "data: "+newevent.inspect+" \n\n"
end

我之前使用JSP和Tomcat编写了类似的服务器端代码,并且在所有浏览器上都能正常工作。

关于Sinatra,我需要知道什么呢?谢谢!


2
发现问题所在,我没有设置正确的响应头。看起来 Chrome Dev 在处理头部时更加宽容。下面的头部可以工作:response.headers ['Content-Type'] = 'text/event-stream' response.headers ['Cache-Control'] = 'no-cache' - user248257
2
那只会返回一个值并关闭连接。那么相比AJAX有什么优势呢? - Konstantin Haase
1个回答

26

1
Konstantin,你如何从订阅者列表中删除已关闭的连接?Chrome在60秒后关闭EventSource连接并打开一个新连接,因此列表会不断增长。是否有一种类似于WebSocket的无限超时设置EventSource的方法? - Andrei
Konstantin回复说:您可以向body对象添加callback/errback。如果在60秒内没有发生任何事情,您可以发送空字节或空消息(使用EventMachine的超时事件)。 - Andrei
6
请参阅编写良好的链接文本,“这里”不是一个好的链接文本。 - Jonas
有关Sinatra的更多答案和评论,涉及event streamingWebSockets - Andrei

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接