12

在我对 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()

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

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

4

2 回答 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/的 websockets似乎没有 connectionMade() 方法,而您唯一可以挂钩的是__init__。如果它是一个“正常”的扭曲协议,通常你会覆盖 connectionMade() 。 --固定在上游

于 2010-12-10T06:32:59.467 回答
0

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

于 2017-01-06T22:39:56.123 回答