SSE(服务器发送事件)断开连接

3
我正在尝试在Chrome中使用SSE(服务器发送事件)实现一个股票应用程序。但是在我找到的每个示例中,无论是自己写的还是别人写的,连接都会在3-4秒钟后关闭。即使在运行以下示例时:http://www.w3schools.com/html5/tryit.asp?filename=tryhtml5_sse,您也可以看到每隔3-4秒钟就会收到一次更新。这不是由于服务器实现(例如此示例中的“demo_sse.php”),而是由于每隔3-4秒钟就会重新连接。
如果我将以下内容添加到上面的示例中:
source.onerror=function(event)
{
  document.getElementById("result").innerHTML+=source.readyState+ "<br />";
};

您可以清楚地看到,readyState为0,意味着:“连接尚未建立,或已关闭且用户代理正在重新连接。”(摘自官方EventSorce API文档)。

我也自己编写了一个服务器端脚本,以下是代码(使用Python Bottle Web框架):

@route('/events')
def positions():  
    response.content_type = 'text/event-stream'
    response.set_header('Cache-Control', 'no-cache')
    now = datetime.datetime.now().time().replace(microsecond=0)
    return  "data: %s\n\n"%now

我也遇到了同样的问题,每隔3-4秒就需要重新连接。

因此我想知道的是如何在会话期间保持连接的。

谢谢您的帮助, Omer。


你知道服务器的实现吗?SSE在连接丢失时通过重新连接来工作,你怎么知道这不是有意为之呢? - Bergi
你好,感谢您的回复。我已经自己编写了一个示例,其中我没有断开连接。我所做的一切就是返回一些数据。以下是代码(使用Python瓶子Web框架)。@route('/events') def positions():
response.content_type = 'text/event-stream' response.set_header('Cache-Control', 'no-cache') now = datetime.datetime.now().time().replace(microsecond=0) return "data: %s\n\n"%now但我得到了同样的结果。每3-4秒重新连接。
- omer bach
嗯,请将那段代码发布到您的问题中,而不是作为评论 - 对不起,我不了解Python或该框架。您可以重新表述您的问题为“为什么我的脚本[代码]会断开连接?” - Bergi
代码在问题中。当使用SSE时,我需要注意https会话未断开吗?还是这个机制已经包含在SSE机制中了? - omer bach
我在将近4年后遇到了这个问题。要让SSE与bottle.py一起工作,您需要安装gevent模块(pip install gevent)。 - jschiavon
2个回答

0

确保Bottle没有为您设置Content-Length标头。 这行代码 看起来有点可疑。

Bottle的此问题所建议的那样返回一个迭代器,可能会实现您想要的功能。

@route('/events')
def positions():
  yield 'START'
  while stream_alive:
      some_event.wait()
      yield some_data()
  yield 'END'

0
据我所知,SSE 被定义为通过这些重新连接工作。 您可以使用内容长度 hackery 来欺骗它们... 比如在您的头部建立内容长度为 0。

在SSE服务器端连接中,每个数据行可能具有特定于重新连接的“id”定义。重新连接时,浏览器将发送一个带有流中接收到的最后一个“id”的“Last-Event-ID”请求标头,并且您可以在服务器脚本中访问它并根据需要处理它。与内容长度无关。 - nxasdf

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