Twisted和Websockets:超越Echo

jMy*_*les 12 python comet twisted websocket twisted.web

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

至少在目前,websocket宇宙的"hello world"似乎是"回声"功能.也就是说,演示的应用程序通常是"我送东西,我收到的东西."

虽然恰当地证明了协议是有用的,但这个例子实际上只展示了传统请求/响应周期所能实现的相同类型的通信.

例如,我可以找到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()
Run Code Online (Sandbox Code Playgroud)

我怎样才能在这里检查"推送"功能?也就是说,我如何让Web套接字保持打开状态,然后在某个时间由某些事件的发生决定,通过websocket发送消息,其内容也受此事件的影响?

(那些对这个问题感兴趣的人也可能会认为这个问题引起了我几天前提出的问题:使用websockets和python/django进行移动(/ twisted?))

Jer*_*rub 9

这是一个更新的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)
Run Code Online (Sandbox Code Playgroud)

不幸的是,来自https://github.com/rlotun/txWebSocket/的 websockets 似乎没有connectionMade()方法,相反,你唯一可以挂钩的是 __init__.通常你只是覆盖connectionMade(),如果它是'正常'扭曲协议. - 固定在上游

  • 我维护https://github.com/rlotun/txWebSocket/,我刚刚添加了一个`connectionMade`钩子. (4认同)

jMy*_*les 0

我在Django-NYC 的一次演讲中使用hendrix展示了如何设置一个 Web 应用程序,该应用程序使用 websockets 将消息从 telnet 服务器推送到网页。