Twisted与Websockets:超越回声
我最近对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服务器的信息推送到网页上的。