无法在类内部发送websockets消息

2024-04-20 08:31:03 发布

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

我计划编写一个包装包websockets的类WebsocketHandler

代码如下:

import asyncio
import websockets


class WebsocketHandler:
    __connection = None

    def __init__(self):
        asyncio.run(self.__setConnection())

    async def __setConnection(self):
        async with websockets.connect("ws://localhost/your/path") as websocket:
            self.__connection = websocket
            print("Connected")

    def send(self, msg):
        self.__connection.send(msg)
        print("message Send")


ws = WebsocketHandler()
ws.send("message")

对于服务器部分,我有另一个完成的脚本,它可以在我有一个新的连接,当我收到一个消息,当我有一个客户端断开连接时,它会向我发送一个消息。在

当我尝试它时,脚本成功地连接到我的websocket服务器(scriptprintConnected),在服务器端我得到了一个新的连接。在

我的脚本里有个警告

^{pr2}$

然后我的脚本打印Message send,它就停止了。在

问题是,在服务器端,我接收不到有消息的事实,只有一条消息告诉我客户端已断开连接。基本上,脚本不会发送消息,也不会产生错误。在

有人知道问题出在哪里吗?在


Tags: importself脚本sendasyncio消息asyncws
1条回答
网友
1楼 · 发布于 2024-04-20 08:31:03

问题是WebsocketHandler类只有一个异步方法,即__setConnection,它是通过调用asyncio.run函数来运行的。那个docs的人这么说

This function always creates a new event loop and closes it at the end.

也就是说,这是唯一可以运行异步代码的地方。您的代码创建一个websocket连接,并在打印“Connected”后立即关闭它。发生这种情况是因为您使用async with调用websockets.connect方法作为异步上下文管理器,在退出时自动关闭连接。这是第一个缺陷,第二个缺陷是self.__connection.send函数是一个协程,它不会运行,直到您等待为止。这正是错误消息告诉您的。以下是如何修复websocket处理程序类:

import asyncio
import websockets


class WebsocketHandler(object):

    def __init__(self):
        self.conn = None

    async def connect(self, url):
        self.conn = await websockets.connect(url)

    async def send(self, msg):
        await self.conn.send(msg)

    async def close(self):
        await self.conn.close()


async def main():
    handler = WebsocketHandler()
    await handler.connect('ws://localhost:8765')

    await handler.send('hello')
    await handler.send('world')

    await handler.close()


loop = asyncio.get_event_loop()
loop.run_until_complete(main())

相关问题 更多 >