简体   繁体   中英

Python UDP and Websockets together

I'm working on a application. Where am using python websockets. Now I need UDP and WS asynchronously running and listening on different ports.

I'm unable to do it because WS recv() waits indefinitely untill a message is received. Message will be received and pushed into queue. I need UDP to receive and push to same queue. This below class implements only websockets. I need another class with UDP and both class instance run asynchronously.

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

thanks for your time in the comments. I solved this issue by running instances of WS and UDP in 2 different daemon threads.

A good way to solve this issue would be to use threads. You could accept a message and put it into a queue, then handle the queue on a different thread.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM