autobahn | python 과 asyncio
을 사용하여 websocket/wamp 클라이언트를 구현하려고하는데, 다소 효과가 있지만, 은 나를 벗어났습니다.autobahn asyncio와 함께 대화 형 websocket 클라이언트를 구현하려면 어떻게해야합니까?
내가 정말로하려는 것은 qt5/QML에 WAMP를 구현하는 것이지만,이 은 더 쉬운 경로처럼 보였다.
주로 온라인에서 복사 한이 단순화 된 클라이언트가 작동합니다. onJoin
이 발생하면 시간 서비스를 읽습니다.
외부 소스에서이 읽기를 실행하고 싶습니다.
내가 취한 복잡한 방법은 스레드에서 asyncio
이벤트 루프를 실행 한 다음 소켓을 통해 명령을 보내서 읽기를 트리거하는 것입니다. I 지금까지 루틴/코 루틴을 어디에 두어야하는지 알 수 없으므로 리더 루틴에서 찾을 수 있습니다.
나는 이것에 관해서 더 간단한 방법이 있다고 의심하지만 아직 발견하지 못했습니다. . 제안을 환영합니다.
#!/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')
그렇다면 일부 외부 수단을 통해 클라이언트가 시간 서비스에 RPC 호출을하도록 할 수 있습니까? – dano