【问题标题】:Server-push whenever a function is called: Ajax or WebSockets每当调用函数时服务器推送:Ajax 或 WebSockets
【发布时间】:2016-07-27 22:32:20
【问题描述】:

我目前正在使用 Tornado (python) 中的状态仪表板。每当调用外部函数时,我都需要动态更新网页(通过重新呈现模板)。我很好奇实现这一目标的最有效方法是什么?他们有没有类似的教程。

【问题讨论】:

    标签: ajax python-3.x websocket tornado


    【解决方案1】:

    如果您想要实际的服务器推送,那么您将需要 webSocket 或服务器发送的事件。由于服务器发送的事件非常新(很多浏览器不支持),实际服务器推送的主要选项是 webSocket 连接。

    在 webSocket 架构中,客户端连接到服务器,然后保持连接。这允许服务器随时通过该连接向客户端发送数据。

    服务器发送的事件是类似的架构,但在使用方式上具有不同的实现细节。


    没有办法将 Ajax 用于实际的服务器推送。 Ajax 有时用于通过使用通常称为长轮询的方式来模拟服务器发送的事件。在这种情况下,客户端进行 Ajax 调用,而服务器只是在 Ajax 请求上挂起一段时间,而不是立即返回响应。如果在此期间服务器端事件到达,则服务器可以获取正在等待响应的连接并发送响应。客户端将获得响应,对其进行处理,然后进行另一个 Ajax 调用。在长轮询中,如果一段时间后没有发生服务器端操作,Ajax 调用将超时,客户端必须启动新连接。

    长轮询的整个连接序列通常比 webSocket 连接效率低。因此,如果您要解决的主要问题是服务器推送,那么 webSocket 连接可能是最有效的方法,并且得到广泛支持。

    以下是一些包含更多讨论的类似问题和答案:websocket vs rest API for real time data?Ajax vs Socket.io

    【讨论】:

    • 只是一个额外的贡献:除了 IE 之外的所有浏览器都支持 SSE,但是您可以使用现有的库来为 SSE 提供基本支持。当通信是一个方向(服务器到客户端)时,我总是选择 SSE,因为它更容易实现,而且您不必关心连接失败和处理重新连接。如果您使用 java,也许这很有用:github.com/mariomac/jeasse
    • 谢谢!我现在正在实现网络套接字,但我想研究 SSE,你知道任何将它与 python/Tornado 一起使用的教程吗?
    猜你喜欢
    • 2011-08-17
    • 2021-05-29
    • 2010-11-27
    • 2012-01-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多