Twisted与Websockets:超越回声

12 投票
2 回答
8746 浏览
提问于 2025-04-16 08:20

我最近对websocket产生了浓厚的兴趣,发现了一个趋势:

目前,websocket的“入门示例”似乎是“回声”功能。也就是说,通常展示的应用是“我发送了什么,我也收到了什么”。

虽然这个例子很好地展示了协议是可以工作的,但实际上它只是展示了传统请求/响应循环所能实现的同样类型的通信。

举个例子,我能找到的关于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发送一条消息,而这条消息的内容也受到这个事件的影响?

对这个问题感兴趣的人,可能也会觉得我几天前问的这个问题很有意思:使用websocket和python/django(/twisted?)进行操作

2 个回答

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/ 的websocket似乎没有connectionMade()这个方法,你能用的只有__init__。通常情况下,如果这是一个“正常”的twisted协议,你会直接重写connectionMade()方法。 --在上游已修复

0

我在hendrix上展示了如何搭建一个网络应用。在Django-NYC的一个讲座中,我讲解了这个应用是如何利用websockets技术,把来自telnet服务器的信息推送到网页上的。

撰写回答