【问题标题】:Twisted and Websockets: Beyond EchoTwisted 和 Websockets:超越 Echo
【发布时间】:2011-05-23 07:38:33
【问题描述】:

在我对 websockets 的持续好奇中,我注意到了一个趋势:

websocket 世界的“hello world”,至少目前,似乎是“echo”功能。也就是说,演示的应用程序通常是“我发送一些东西,我接收一些东西”。

虽然恰当地证明了该协议的功能,但该示例实际上仅演示了与传统请求/响应周期相同的通信类型。

例如,我能找到的 twisted.web.websockets 的唯一演示(在服务器端)如下:

import sys
from twisted.python import log
from twisted.internet import reactor
from twisted.web.static import File
from twisted.web.websocket import WebSocketHandler, WebSocketSite


class Echohandler(WebSocketHandler):

    def frameReceived(self, frame):
        log.msg("Received frame '%s'" % frame)
        self.transport.write(frame + "\n")


def main():
    log.startLogging(sys.stdout)
    root = File(".")
    site = WebSocketSite(root)
    site.addHandler("/ws/echo", Echohandler)
    reactor.listenTCP(8080, site)
    reactor.run()


if __name__ == "__main__":
    main()

我怎样才能在这里检查“推送”功能?即,如何让websocket保持打开状态,然后在某个时间由某个事件的发生决定,通过websocket发送消息,消息的内容也受这个事件的影响?

(对这个问题感兴趣的人,也可以认为我前几天问的这个问题很有说服力:Making moves w/ websockets and python / django ( / twisted? )

【问题讨论】:

  • 鉴于 websockets 在 Firefox 4 hacks.mozilla.org/2010/12/websockets-disabled-in-firefox-4 中被禁用,即使它们完成后,它们可能不希望在所有浏览器中工作,你可能想为你的两个研究一个更高级别的抽象方式浏览器通信。 Websockets 只是优化 Athena divmod.org/trac/wiki/DivmodNevow/Athena 和 Orbited orbited.org 等事物的一种方式。
  • 与当前规范(和支持)一样,websockets 实际上不是对 Comet(Athena、Orbited 等)的完整改造。目前,我对适用于所有浏览器的解决方案不感兴趣。我只是想构建一些可以在我自己和集体的其他成员之间工作的东西——我们将完全控制我们的浏览器和防火墙条件。
  • 不,不一定。 Athena 是一个完整的高级消息传递系统,它不只是传输字节。而且 Orbited 可以使用多种传输方式,回退到更原始/效率更低的技术,因为它确定更好的传输方式不可用。即使在您的情况下,这也是您想要的东西,因为如果出现比 websockets 更好 的东西,您可能希望利用它而无需重写所有代码。
  • @Glyph:太棒了。这是我在这里提出的问题中的第 6 点:stackoverflow.com/questions/4310706/…(杰出的 50 分赏金!;-))。您能否快速演示一下 Orbited 如何与 Websocket 一起使用,然后在没有适当支持的情况下退回到长轮询?

标签: python twisted comet websocket twisted.web


【解决方案1】:

这是一个更新的 EchoHandler 示例,它不仅是被动的,而且是主动的。

class ChattyHandler(WebSocketHandler):
    def connectionMade(self):
        self.transport.write('oh hai\n')
        self.saysomething()

    def saysomething(self):
        self.transport.write('still there?\n')
        reactor.callLater(5, self.saysomething)

不幸的是,https://github.com/rlotun/txWebSocket/ 的 websockets 似乎没有 connectionMade() 方法,而您唯一可以挂钩的是 __init__。 如果它是一个“正常”的扭曲协议,通常你会覆盖 connectionMade()。 --在上游修复

【讨论】:

  • 这会引发 TypeError: __init__() argument after * must be a sequence, not WebSocketTransport
  • 我维护 github.com/rlotun/txWebSocket 并且我刚刚添加了一个 connectionMade 钩子。
【解决方案2】:

使用hendrix,我展示了如何在a talk at Django-NYC 中设置一个使用websockets 将消息从远程登录服务器推送到网页的网络应用程序。

【讨论】:

    猜你喜欢
    • 2014-12-05
    • 2011-05-20
    • 1970-01-01
    • 2021-04-27
    • 2018-10-09
    • 2010-10-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多