2015-08-19 102 views
1

我有一个简单的python瓶子应用程序,它将SSE事件发送到JavaScript侦听器。处理服务器端事件断开连接

这工作没有任何问题,直到客户端通过浏览器刷新或背页等

“消失”因为从应用程序的事件被传递,然后从内部队列中删除,一个或两个事件丢失当服务器尝试将它们发送给不再存在的客户端时。

我不希望事件丢失,但目前我无法以合理的方式解决此问题。

我打算改用网络套接字,并使用事件 - 确认模型来解决问题,除非我有办法用SSE来防止事件以这种方式丢失。

在我看来,SEE可能不是为我的特殊用例而设计的。

这里是我使用的代码:

@route('/stream/events') 
def event_stream(): 
    response.content_type = 'text/event-stream' 
    response.cache_control = 'no-cache' 
    # Set client-side auto-reconnect timeout, ms. 
    yield 'retry: 1000\n\n' 

    while True: 
     event = event_queue.get() 
     logging.debug("Received event from hal: %s", event) 
     yield "data: " + json.dumps(event) + "\n\n" 

一个链接到我对这个问题的解决方案可以在这里找到。它在客户端消失时使用弱引用'检测',以及每个SEE连接的个别队列:http://blog.jason.spashett.com/python-bottle-server-side-events-one-way-to-handle-client-disconnects.html

+0

你能priovide一段代码,你如何发出有活动吗? – wenzul

+0

@wenzul由于用户按下正在运行的设备上的硬件开关,并且它应该在网页上生成事件,所以不会错过事件。这是为了进行硬件测试。因此不希望有任何事件误入歧途,这可能发生在客户端更改页面时。我会试图将导航从页面上移开,但它看起来不够健壮。这是我需要的单向沟通,但我也需要知道事件已经交付,因此我可能需要引入一个确认。 –

+0

感谢您的答复,最有帮助。我喜欢@baynezy的博客文章。在所有的答案中,我都意识到什么是错的。消息正在发送到一个陈旧的SEE连接,一个新的SEE连接进入页面刷新,但我只有一个队列,哪些项目被删除和交付。我相信每个客户端连接都有问题,从主队列中挑选事件可能很好地解决问题。我发现这个问题令人困惑,因为我有一个Web浏览器客户端,并且只会有一个,但是有两个连接,一个是陈旧的,另一个是新的。 –

回答

1

SSE(服务器发送的事件,HTML 5规范的一部分)就像无线电广播:一旦发生事件,他们被服务器遗忘。

这是将信息从服务器发送到客户端的一种非常好的方式,但是它只是单向的

由于无法可靠地检测到客户端断开连接,因此在您的用例中,一种可能的解决方案确实就是像您所建议的那样做出一种确认。 因为这是一种双向通信技术,所以Web套接字可以。

但是,您可以考虑另一种方案,将SSE与其他机制相结合,例如:客户端可以在每次接收到事件(确认)时发出AJAX请求。为了尽量减少连接时间造成的延迟,您可以使用保持活动请求。这取决于你的事件发生的频率,如果每秒有很多事件忘记这一点。

相关问题