如何从协议外部发送 Autobahn/Twisted WAMP 消息?

Posted

技术标签:

【中文标题】如何从协议外部发送 Autobahn/Twisted WAMP 消息?【英文标题】:How to send Autobahn/Twisted WAMP message from outside of protocol? 【发布时间】:2014-04-28 06:23:15 【问题描述】:

我正在关注the github code 中的基本 wamp pubsub 示例:

此示例从类内发布消息:

class Component(ApplicationSession):
   """
An application component that publishes an event every second.
"""

   def __init__(self, realm = "realm1"):
      ApplicationSession.__init__(self)
      self._realm = realm


   def onConnect(self):
      self.join(self._realm)


   @inlineCallbacks
   def onJoin(self, details):
      counter = 0
      while True:
         self.publish('com.myapp.topic1', counter)
         counter += 1
         yield sleep(1)

我想创建一个引用,以便我可以从代码中的其他地方通过此连接发布消息,即myobject.myconnection.publish('com.myapp.topic1', 'My message')

从这个类似的question 答案似乎是在连接时,我需要设置类似self.factory.myconnection = self 的东西。我已经尝试了多种排列但没有成功。

出厂设置部分如下:

   ## create a WAMP application session factory
   ##
   from autobahn.twisted.wamp import ApplicationSessionFactory
   session_factory = ApplicationSessionFactory()


   ## .. and set the session class on the factory
   ##
   session_factory.session = Component


   ## create a WAMP-over-WebSocket transport client factory
   ##
   from autobahn.twisted.websocket import WampWebSocketClientFactory
   transport_factory = WampWebSocketClientFactory(session_factory, args.wsurl, debug = args.debug)
   transport_factory.setProtocolOptions(failByDrop = False)


   ## start a WebSocket client from an endpoint
   ##
   client = clientFromString(reactor, args.websocket)
   client.connect(transport_factory)

我在课堂上设置的任何引用会附在哪里?到client?到transport_factory?到session_factory?

【问题讨论】:

【参考方案1】:

在您的应用会话加入 WAMP 领域后,它会在应用会话工厂中设置对自身的引用:

class MyAppComponent(ApplicationSession):

   ... snip

   def onJoin(self, details):
      if not self.factory._myAppSession:
         self.factory._myAppSession = self

然后您可以从代码中的其他位置访问此会话,例如

   @inlineCallbacks
   def pub():
      counter = 0  
      while True:
         ## here we can access the app session that was created ..
         ##
         if session_factory._myAppSession:
            session_factory._myAppSession.publish('com.myapp.topic123', counter)
            print("published event", counter)
         else:
            print("no session")
         counter += 1
         yield sleep(1)

   pub()

【讨论】:

感谢您添加“官方”示例。事实证明我的主要问题是我的程序在完全初始化之前试图访问会话引用。 链接已失效;例如移动或删除?在放弃之前,我已经到了this 寻找类似session/fromoutside 的东西。

以上是关于如何从协议外部发送 Autobahn/Twisted WAMP 消息?的主要内容,如果未能解决你的问题,请参考以下文章

如何从外部附件异步发送和接收数据

如何使用从外部脚本调用的回调发送信号?

如何从消费者类外部发送 channel_session 数据

外部附件命令协议

如何使用从外部脚本调用的回调发送信号?

如何在 django 频道中从消费者类外部发送普通 JSON 消息