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

Posted

技术标签:

【中文标题】使用 Ruby Sinatra 的 HTML5 服务器发送事件【英文标题】:HTML5 Server-Sent Events with Ruby Sinatra 【发布时间】:2011-07-10 18:58:26 【问题描述】:

我是 Ruby 和 Sinatra 的新手,我正在尝试使用它设置一个简单的 html5 服务器发送事件,下面的代码在 Chrome 开发人员构建中运行良好,但在 Windows7 和 OSX 上的非开发人员构建和 Safari 中失败.

浏览器控制台中的错误信息是“加载资源失败:已取消”

 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,我需要了解什么? 谢谢!

【问题讨论】:

想通了,我没有设置正确的响应标头,似乎 Chrome Dev 在标头方面更轻松。下面的标题工作.. response.headers['Content-Type'] = 'text/event-stream' response.headers['Cache-Control'] = 'no-cache' 那只会返回一个值并关闭连接。那么与 AJAX 相比有什么优势呢? 【参考方案1】:

如果你想支持活动,你必须create your own body object。看看the implementation 和usage。确保使用 Thin 或 Rainbows 运行它。它不适用于 Mongrel 或 WEBrick。

您可以观看presentation at Confreaks(其source code at GitHub)。

更新:这里是one more example(使用 Sinatra Streaming API 的简单聊天应用程序)。

【讨论】:

康斯坦丁,你将如何从订阅者列表中删除已关闭的连接? Chrome 在 60 秒后关闭 EventSource 连接并打开一个新连接,因此列表正在增长。有没有办法为 EventSource 设置类似于 WebSocket 的无限超时? Konstantin 回答:你可以在 body 对象中添加一个callback/errback。如果 60 秒内没有发生任何事情,您可以发送空字节或空消息(为此使用 EventMachine 的超时事件)。 见Writing Good Link Text,“这里”是不是好的链接文字。 更多关于 Sinatra 的答案和 cmets 与 event streaming 和 WebSockets

以上是关于使用 Ruby Sinatra 的 HTML5 服务器发送事件的主要内容,如果未能解决你的问题,请参考以下文章

Sinatra / Warden / Ruby - 如何确保我的用户只能使用单个会话登录?

在google appengine上部署ruby + sinatra应用程序

如何在 Heroku 上托管的 Ruby/Sinatra 应用程序中设置 HTTP 标头?

使用 ruby​​、Sinatra 和 Mandrill 如何从 api 调用访问单个元素并打印为 HTML?

ruby Twilio Sinatra

ruby Sinatra API REST CRUD