【问题标题】:Understanding Autobahn and Twisted integration了解 Autobahn 和 Twisted 集成
【发布时间】:2014-05-10 18:03:05
【问题描述】:

我试图理解这里给出的例子:https://github.com/tavendo/AutobahnPython/tree/master/examples/twisted/wamp/basic/pubsub/basic

我构建了这个脚本,它应该处理多个 pub/sub websocket 连接,并为传入的控制消息打开一个 tcp 端口 ( 8123 )。当 8123 端口收到消息时,应用程序应向所有连接的订阅者广播在端口 8123 上收到的消息。我如何使 NotificationProtocol 或 NotificationFactory 与 websocket 通信并使 websocket 服务器广播消息。

我不明白的另一件事是网址。客户端 javascript 连接到 URL http://:8080/ws 。 “ws”从何而来?

也有人能解释一下RouterFactory、RouterSessionFactory和这个位的用途吗:

from autobahn.wamp import types
session_factory.add( WsNotificationComponent(types.ComponentConfig(realm = "realm1" )))

我的代码如下:

import sys, time
from twisted.internet import reactor
from twisted.internet.protocol import Protocol, Factory
from twisted.internet.defer import inlineCallbacks
from autobahn.twisted.wamp import ApplicationSession
from autobahn.twisted.util import sleep


class NotificationProtocol(Protocol):
    def __init__(self, factory):
        self.factory = factory

    def dataReceived(self, data):
        print "received new data"

class NotificationFactory(Factory):
    protocol = NotificationProtocol

class WsNotificationComponent(ApplicationSession):
   @inlineCallbacks
   def onJoin(self, details):
      counter = 0
      while True:
         self.publish("com.myapp.topic1", "test %d" % counter )
         counter += 1
         yield sleep(1)



## we use an Autobahn utility to install the "best" available Twisted reactor
   ##
from autobahn.twisted.choosereactor import install_reactor
reactor = install_reactor()

## create a WAMP router factory
##
from autobahn.wamp.router import RouterFactory
router_factory = RouterFactory()

## create a WAMP router session factory
##
from autobahn.twisted.wamp import RouterSessionFactory
session_factory = RouterSessionFactory(router_factory)

from autobahn.wamp import types
session_factory.add( WsNotificationComponent(types.ComponentConfig(realm = "realm1" )))

from autobahn.twisted.websocket import WampWebSocketServerFactory
transport_factory = WampWebSocketServerFactory(session_factory)
transport_factory.setProtocolOptions(failByDrop = False)


from twisted.internet.endpoints import serverFromString
## start the server from an endpoint
##
server = serverFromString(reactor, "tcp:8080")
server.listen(transport_factory)

notificationFactory = NotificationFactory()
reactor.listenTCP(8123, notificationFactory)

reactor.run()

【问题讨论】:

    标签: python websocket twisted autobahn


    【解决方案1】:

    我如何让NotificationProtocolNotificationFactory与websocket对话并让websocket服务器广播消息”:

    查看我在 SO 上的其他答案之一:Persistent connection in twisted。跳转到示例代码并像“IO”逻辑一样对您的 websocket 逻辑进行建模,您将非常适合(您可能还想从一个扭曲的核心团队中看到关于 newer endpoint calls 的后续答案也)

    "“ws”从何而来?"

    Websockets 是通过重新分配 http 连接来实现的,从本质上讲,这些连接必须在请求上有一个特定的路径。该“ws”路径通常会映射到高速公路为您构建的特殊http处理程序以处理websockets(或者至少这是您的javascript所期望的......)。假设设置正确,您实际上可以将您的网络浏览器指向该 url,它应该打印出有关 websocket 握手的错误(在我的情况下为Expected WebSocket Headers,但我使用的是cyclones websockets 而不是高速公路)。

    附: “websockets 必须有特定路径”的一个很酷的副作用是,您实际上可以在同一个处理程序/侦听/端口上混合 websockets 和正常的 http 内容,当您尝试在相同的情况下运行它们时,这非常方便SSL 端口,因为您试图避免代理前端代码的要求。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-07-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多