首页
学习
活动
专区
圈层
工具
发布
社区首页 >专栏 >[python][原创]websocket服务器封装类

[python][原创]websocket服务器封装类

作者头像
云未归来
发布2025-07-19 14:23:50
发布2025-07-19 14:23:50
1210
举报
代码语言:javascript
复制
import asyncio
import time
import websockets
import threading
'''
websocket服务器,唯一问题是recv阻塞后不能对客户端发消息,目前没办法解决
'''

class WebsocketServer(object):
    def __init__(self, ip="127.0.0.1", port=8088,callback=None):
        self.ip = ip
        self.port = port
        self.th = None
        self.callback=callback
        self.websocket_users = set()

    def start(self):
        self.th = threading.Thread(target=self.__start, args=())
        self.th.daemon = True
        self.th.start()


    def __start(self):
        print('start server...')
        loop = asyncio.new_event_loop()
        asyncio.set_event_loop(loop)
        loop.run_until_complete(websockets.serve(self.connarrived, self.ip, self.port))
        loop.run_forever()

    # 接收客户端消息并处理,这里只是简单把客户端发来的返回回去
    async def recv_user_msg(self,websocket):
        while True:
            print('loop...')
            recv_text = await websocket.recv()
            print("message:", recv_text)
            #await websocket.send('bug')


    async def send_data(self, msg):
        if len(self.websocket_users)==0:
            return
        print('user count:',len(self.websocket_users))
        for client in self.websocket_users:
            await client.send(msg)

    async def connarrived(self,websocket, path):
        print('new connect comming...')
        try:
            self.websocket_users.add(websocket)
            await self.recv_user_msg(websocket)
        except websockets.ConnectionClosed:
            print("ConnectionClosed...", path)  # 链接断开
            print("old websocket_users:", self.websocket_users)
            self.websocket_users.remove(websocket)
            print("current websocket_users:", self.websocket_users)
        except websockets.InvalidState:
            print("InvalidState...")  # 无效状态
        except Exception as e:
            print("Exception:", e)


if __name__ == '__main__':
    ws = WebsocketServer()
    ws.start()
    while True:
        time.sleep(5)
        print('start send data')
        ws.send_data('123,jiayou')

经过测试上面的模块运行正常,唯一缺点是不能发送信息,不清楚为什么123,jiayou这个信息发不出,就是客户端接受不到,但是在recv后直接发消息确实可以在客户端接受到,目前问题是recv调用后处于阻塞状态,导致无法给客户端发消息,目前没有好方法解决,如果有大佬看到这个代码能解决发送问题的话,这个模块就变得十分完善而且好用。目前只能接受信息并且只能在接受信息recv()后发消息。

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2023-02-14,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档