过去,一个常见的选择是使用Juggernaut将数据从服务器推送到客户端。它甚至在 websockets 被广泛使用之前就被使用了,但最近它已经被弃用,取而代之的是HTML5 Server-Sent-Events (SSE)。要使用 SSE,您可以像这样应用客户端侦听器:
var source = new EventSource('/stream');
source.addEventListener('message', function(e) {
console.log('Received a message:', e.data);
//fetch new data with AJAX, or reload
location.reload();
});
服务器端,发送事件的方式有很多种。使用Cramp,发送事件是这样完成的(取自文档):
class TimeAction < Cramp::Action
self.transport = :sse
#set the transport to Server-Sent Event
on_start :send_latest_time
periodic_timer :send_latest_time, :every => 2
def send_latest_time
data = {'time' => Time.now.to_i}.to_json
render data
end
end
如果您使用 Sinatra,您的代码将如下所示:
get '/stream', :provides => 'text/event-stream' do
stream :keep_open do |out|
connections << out
out.callback { connections.delete(out) }
end
end
除了 Internet Explorer 和 Opera Mini,几乎所有浏览器都支持服务器发送事件,但也有一些备用/polyfill 库,例如此处或此处的一个(jQuery 解决方案)。与 websocket 不同,它们仍然使用 HTTP 协议,但请记住,它们是单向的,而 websocket 可用于多向通信。如果您对 SSE 和 websockets 之间的区别感到好奇,请参阅此处。