- add subscription via MessageDispatcher
This commit is contained in:
@@ -200,7 +200,7 @@ if __name__ == '__main__':
|
|||||||
h_dispatcher = taskmgr.start()
|
h_dispatcher = taskmgr.start()
|
||||||
h_server = server.listen("localhost", 8765)
|
h_server = server.listen("localhost", 8765)
|
||||||
asyncio.gather(h_dispatcher, h_server)
|
asyncio.gather(h_dispatcher, h_server)
|
||||||
server.loop.run_forever()
|
server.run_forever()
|
||||||
|
|
||||||
while True:
|
while True:
|
||||||
print("Hallo")
|
print("Hallo")
|
||||||
|
|||||||
+6
-16
@@ -11,15 +11,16 @@ from ws.connection import IConnection
|
|||||||
class Window(QtWidgets.QMainWindow, Ui_MainWindow):
|
class Window(QtWidgets.QMainWindow, Ui_MainWindow):
|
||||||
def __init__(self):
|
def __init__(self):
|
||||||
QtWidgets.QMainWindow.__init__(self)
|
QtWidgets.QMainWindow.__init__(self)
|
||||||
self.msg_dispatch = MessageDispatcher()
|
loop = asyncio.new_event_loop()
|
||||||
self.ws_client = WsClient(listener=self.msg_dispatch)
|
self.msg_dispatch = MessageDispatcher(auto_subscribe=True, loop=loop)
|
||||||
|
self.ws_client = WsClient(listener=self.msg_dispatch, loop=loop)
|
||||||
self.msg_pot = self.msg_dispatch.msgio_get('Pot')
|
self.msg_pot = self.msg_dispatch.msgio_get('Pot')
|
||||||
self.msg_sensor = self.msg_dispatch.msgio_get('Sensor')
|
self.msg_sensor = self.msg_dispatch.msgio_get('Sensor')
|
||||||
self.msg_heater = self.msg_dispatch.msgio_get('Heater')
|
self.msg_heater = self.msg_dispatch.msgio_get('Heater')
|
||||||
|
|
||||||
self.msg_pot.set_recv_handler(self.on_pot_changed)
|
# self.msg_pot.set_recv_handler(self.on_pot_changed)
|
||||||
self.msg_sensor.set_recv_handler(self.on_sensor_changed)
|
# self.msg_sensor.set_recv_handler(self.on_sensor_changed)
|
||||||
self.msg_heater.set_recv_handler(self.on_heater_changed)
|
# self.msg_heater.set_recv_handler(self.on_heater_changed)
|
||||||
|
|
||||||
self.setupUi(self)
|
self.setupUi(self)
|
||||||
self.actionStart.triggered.connect(self.connect)
|
self.actionStart.triggered.connect(self.connect)
|
||||||
@@ -41,17 +42,6 @@ class Window(QtWidgets.QMainWindow, Ui_MainWindow):
|
|||||||
def on_heater_changed(self, msg):
|
def on_heater_changed(self, msg):
|
||||||
print("on_heater_changed")
|
print("on_heater_changed")
|
||||||
|
|
||||||
def on_connect(self):
|
|
||||||
self.send_data.put_nowait({'+': 'Pot'})
|
|
||||||
self.send_data.put_nowait({'+': 'Sensor'})
|
|
||||||
self.send_data.put_nowait({'+': 'Heater'})
|
|
||||||
|
|
||||||
def on_disconnect(self):
|
|
||||||
pass
|
|
||||||
|
|
||||||
async def on_recv(self, data):
|
|
||||||
pass
|
|
||||||
|
|
||||||
async def on_send(self):
|
async def on_send(self):
|
||||||
try:
|
try:
|
||||||
data = await asyncio.get_event_loop().run_in_executor(None, self.send_data.get, True, 1)
|
data = await asyncio.get_event_loop().run_in_executor(None, self.send_data.get, True, 1)
|
||||||
|
|||||||
@@ -8,9 +8,9 @@ from ws.connection import IConnection
|
|||||||
|
|
||||||
|
|
||||||
class WsClient:
|
class WsClient:
|
||||||
def __init__(self, listener: IConnection):
|
def __init__(self, listener: IConnection, loop=None):
|
||||||
self.listener = listener
|
self.listener = listener
|
||||||
self.loop = asyncio.new_event_loop()
|
self.loop = loop
|
||||||
self.stop = None
|
self.stop = None
|
||||||
self.bg_thread = None
|
self.bg_thread = None
|
||||||
|
|
||||||
@@ -44,7 +44,7 @@ class WsClient:
|
|||||||
return
|
return
|
||||||
|
|
||||||
print("handler: got connection to {}".format(websocket.remote_address))
|
print("handler: got connection to {}".format(websocket.remote_address))
|
||||||
self.listener.on_connect(self.loop)
|
await self.listener.on_connect()
|
||||||
try:
|
try:
|
||||||
path = "/"
|
path = "/"
|
||||||
consumer_task = asyncio.ensure_future(self.handler_recv(websocket, path), loop=self.loop)
|
consumer_task = asyncio.ensure_future(self.handler_recv(websocket, path), loop=self.loop)
|
||||||
@@ -55,7 +55,7 @@ class WsClient:
|
|||||||
finally:
|
finally:
|
||||||
print("handler: lost connection from {}".format(websocket.remote_address))
|
print("handler: lost connection from {}".format(websocket.remote_address))
|
||||||
await websocket.close()
|
await websocket.close()
|
||||||
self.listener.on_disconnect()
|
await self.listener.on_disconnect()
|
||||||
|
|
||||||
async def handler_recv(self, websocket, path):
|
async def handler_recv(self, websocket, path):
|
||||||
while True:
|
while True:
|
||||||
|
|||||||
+10
-4
@@ -45,9 +45,11 @@ class Value:
|
|||||||
|
|
||||||
|
|
||||||
class MessageDispatcher(IConnection):
|
class MessageDispatcher(IConnection):
|
||||||
def __init__(self):
|
def __init__(self, auto_subscribe=False, loop=None):
|
||||||
self.msg_handlers: MsgIo = []
|
self.msg_handlers: MsgIo = []
|
||||||
self.state = None
|
self.state = None
|
||||||
|
self.state = asyncio.Queue(loop=loop)
|
||||||
|
self.auto_subscribe = auto_subscribe
|
||||||
|
|
||||||
def msgio_get(self, key):
|
def msgio_get(self, key):
|
||||||
obj = MsgIo(key, self.send)
|
obj = MsgIo(key, self.send)
|
||||||
@@ -56,10 +58,14 @@ class MessageDispatcher(IConnection):
|
|||||||
return obj
|
return obj
|
||||||
return None
|
return None
|
||||||
|
|
||||||
def on_connect(self, loop):
|
async def on_connect(self):
|
||||||
self.state = asyncio.Queue(loop=loop)
|
if self.auto_subscribe:
|
||||||
|
for handler in self.msg_handlers:
|
||||||
|
key = handler.get_key()
|
||||||
|
print("Would subscribe {}".format(key))
|
||||||
|
await self.send({'+': key})
|
||||||
|
|
||||||
def on_disconnect(self):
|
async def on_disconnect(self):
|
||||||
pass
|
pass
|
||||||
|
|
||||||
async def on_recv(self, data):
|
async def on_recv(self, data):
|
||||||
|
|||||||
@@ -5,10 +5,13 @@ import abc
|
|||||||
|
|
||||||
class WsServer:
|
class WsServer:
|
||||||
def __init__(self, loop=None):
|
def __init__(self, loop=None):
|
||||||
if loop is None:
|
self.loop = loop
|
||||||
self.loop = asyncio.get_event_loop()
|
|
||||||
|
def run_forever(self):
|
||||||
|
if self.loop is None:
|
||||||
|
asyncio.get_event_loop().run_forever()
|
||||||
else:
|
else:
|
||||||
self.loop = loop
|
self.loop.run_forever()
|
||||||
|
|
||||||
async def listen(self, host, port):
|
async def listen(self, host, port):
|
||||||
return await websockets.serve(self.handler, host, port, loop=self.loop)
|
return await websockets.serve(self.handler, host, port, loop=self.loop)
|
||||||
|
|||||||
@@ -21,7 +21,6 @@ class WsServerMultiUser(WsServer):
|
|||||||
self.listener = listener
|
self.listener = listener
|
||||||
self.USERS = UserSet()
|
self.USERS = UserSet()
|
||||||
self.global_state = {}
|
self.global_state = {}
|
||||||
self.listener.on_connect(self.loop)
|
|
||||||
|
|
||||||
async def notify_state(self, data):
|
async def notify_state(self, data):
|
||||||
if self.USERS: # asyncio.wait doesn't accept an empty list
|
if self.USERS: # asyncio.wait doesn't accept an empty list
|
||||||
|
|||||||
Reference in New Issue
Block a user