Python UDP和Websockets一起

时间:2019-07-03 03:20:26

标签: python python-3.x

我正在处理一个应用程序。在哪里使用python websockets。现在,我需要异步运行并在不同端口上侦听的UDP和WS。

我无法执行此操作,因为WS recv()无限期等待,直到收到一条消息为止。消息将被接收并推入队列。我需要UDP才能接收并推送到同一队列。下面的此类仅实现websocket。我需要另一个带有UDP的类,并且两个类实例都异步运行。

import websockets
import json
from sinric.command.mainqueue import queue
from sinric.callback_handler.cbhandler 
import CallBackHandler
from time import sleep


class SinricProSocket:
    def __init__(self, apiKey, deviceId, callbacks):
        self.apiKey = apiKey
        self.deviceIds = deviceId
        self.connection = None
        self.callbacks = callbacks
        self.callbackHandler = CallBackHandler(self.callbacks)
        pass

    async def connect(self):  # Producer
        self.connection = await websockets.client.connect('ws://2.5.2.2:301',
                                                          extra_headers={'Authorization': self.apiKey,
                                                                         'deviceids': self.deviceIds},
                                                          ping_interval=30000, ping_timeout=10000)
        if self.connection.open:
            print('Client Connected')
            return self.connection

    async def sendMessage(self, message):
        await self.connection.send(message)

    async def receiveMessage(self, connection):
        try:
            message = await connection.recv()
            queue.put(json.loads(message))
        except websockets.exceptions.ConnectionClosed:
            print('Connection with server closed')

    async def handle(self):
        # sleep(6)
        while queue.qsize() > 0:
            await self.callbackHandler.handleCallBacks(queue.get(), self.connection)
        return

2 个答案:

答案 0 :(得分:1)

感谢您在评论中的时间。我通过在2个不同的守护程序线程中运行WS和UDP实例解决了这个问题。

答案 1 :(得分:1)

解决此问题的一种好方法是使用线程。您可以接受一条消息并将其放入队列,然后在另一个线程上处理该队列。