Twisted和Websockets:超越Echo

时间:2010-12-10 06:21:34

标签: python twisted comet 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()

如何在此处检查“推送”功能?即,如何让Web套接字保持打开状态,然后在某个时间由某个事件的发生决定,通过websocket发送消息,其内容也受此事件的影响?

(对这个问题感兴趣的人也可能会认为这个问题引起了我几天前提出的问题:Making moves w/ websockets and python / django ( / twisted? )

2 个答案:

答案 0 :(得分: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)

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

答案 1 :(得分:0)

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