使用 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 标头?