Python websockets,无法接收消息

2024-04-26 10:43:15 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在一个python项目中使用websockets。websocket正在线程中运行,并从父线程获得2queue's。我使用javascript连接到websocket服务器。在

我能够通过self.ssi.get(True)从父线程获取消息,并将它们传递给javascript websocket客户端。在

但我无法接收客户的信息。当我使用zaproxy时,我可以看到消息通过。在websocket服务器上,我还可以看到数据包到达接口。Python不会抛出错误,logger.setLevel(logging.DEBUG)不会以我能够看到的方式显示消息的到达方式。在

我一直试图解决这个问题,但我已经没有办法找到问题,任何帮助都欢迎。在

Python websocket服务器:

import websockets
import logging
import asyncio
import ssl

class websocket:
    def __init__(self,ssi,sso):

        self.ssi = ssi
        self.sso = sso

        logger = logging.getLogger('websockets')
        logger.setLevel(logging.DEBUG)
        # logger.addHandler(logging.FileHandler('debug.log'))
        logger.addHandler(logging.StreamHandler())

        sslc = ssl.SSLContext(ssl.PROTOCOL_TLSv1_2)
        sslc.load_cert_chain(
            'keys/wss.server.crt',
            'keys/wss.server.key')

        loop = asyncio.new_event_loop()
        wsrv = websockets.serve(
            self.handler,
            host='0.0.0.0',
            port=9000,
            ssl=sslc,
            loop=loop)

        loop.run_until_complete(wsrv)
        loop.run_forever()

    async def handler(self, wss, path):
        consumer_task = asyncio.ensure_future(self.consumerHandler(wss, path))
        producer_task = asyncio.ensure_future(self.producerHandler(wss, path))
        done, pending = await asyncio.wait(
            [consumer_task, producer_task],
            return_when=asyncio.FIRST_COMPLETED,)
        for task in pending:
            task.cancel()

    async def producerHandler(self, wss, path):
        while True:
            msg = await self.producer()
            await wss.send(str(msg))

    async def consumerHandler(self, wss, path):
        async for msg in wss:
            await self.consumer(msg)

    async def producer(self):
        return self.ssi.get(True)

    async def consumer(self, msg):
        self.sso.put(msg.data)

Javascript客户端:

^{pr2}$

Tags: pathimportselfloopasynciotaskasyncwebsockets
1条回答
网友
1楼 · 发布于 2024-04-26 10:43:15

我认为问题是您混合了queue库和asyncio.queue的用法。在

queue是线程安全的,因此是线程之间通信的良好机制,但它没有异步API,因此当您调用self.ssi.get(True)时,您阻塞了websocket线程,这将阻止任何其他websocket代码的运行。在

asyncio.queue有您想要的API(您可以await queue.get()),但不幸的是它不是线程安全的(它是为单线程异步应用程序设计的)。在

您可以使用loop.run_in_executor等待阻塞queue.get(True)调用。请参阅此处的示例https://carlosmaniero.github.io/asyncio-handle-blocking-functions.html

相关问题 更多 >