【发布时间】:2014-11-03 02:04:23
【问题描述】:
我正在尝试使用 autobahn|python 实现 websocket/wamp 客户端
和asyncio,虽然它有点工作,但有些部分有
躲过了我。
我真正想做的是在 qt5/QML 中实现 WAMP,但这 目前看来是一条更容易的道路。
这个主要从网上复制的简化客户端确实有效。它读取
onJoin 发生时的时间服务。
我想做的是从外部源触发此读取。
我采用的复杂方法是在 线程,然后通过套接字发送命令以触发读取。一世 到目前为止无法弄清楚将例程/协程放在哪里 可以从阅读器例程中找到它。
我怀疑有更简单的方法可以解决这个问题,但我还没有找到 然而。欢迎提出建议。
#!/usr/bin/python3
try:
import asyncio
except ImportError:
## Trollius >= 0.3 was renamed
import trollius as asyncio
from autobahn.asyncio import wamp, websocket
import threading
import time
from socket import socketpair
rsock, wsock = socketpair()
def reader() :
data = rsock.recv(100)
print("Received:", data.decode())
class MyFrontendComponent(wamp.ApplicationSession):
def onConnect(self):
self.join(u"realm1")
@asyncio.coroutine
def onJoin(self, details):
print('joined')
## call a remote procedure
##
try:
now = yield from self.call(u'com.timeservice.now')
except Exception as e:
print("Error: {}".format(e))
else:
print("Current time from time service: {}".format(now))
def onLeave(self, details):
self.disconnect()
def onDisconnect(self):
asyncio.get_event_loop().stop()
def start_aloop() :
loop = asyncio.new_event_loop()
asyncio.set_event_loop(loop)
transport_factory = websocket.WampWebSocketClientFactory(session_factory,
debug = False,
debug_wamp = False)
coro = loop.create_connection(transport_factory, '127.0.0.1', 8080)
loop.add_reader(rsock,reader)
loop.run_until_complete(coro)
loop.run_forever()
loop.close()
if __name__ == '__main__':
session_factory = wamp.ApplicationSessionFactory()
session_factory.session = MyFrontendComponent
## 4) now enter the asyncio event loop
print('starting thread')
thread = threading.Thread(target=start_aloop)
thread.start()
time.sleep(5)
print("IN MAIN")
# emulate an outside call
wsock.send(b'a byte string')
【问题讨论】:
-
那么,您希望能够通过某种外部方式触发客户端对 timeservice 进行 RPC 调用?
标签: python autobahn python-asyncio