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

Posted FL1623863129

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了[python][原创]websocket服务器封装类相关的知识,希望对你有一定的参考价值。

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()后发消息。

以上是关于[python][原创]websocket服务器封装类的主要内容,如果未能解决你的问题,请参考以下文章

Python 服务器 - 处理 WebSocket.close()

python怎么连接websocket

Python - 单向 websocket

托管基于 Python 的 Websocket 服务器

python之websocket

python---websocket