[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服务器封装类的主要内容,如果未能解决你的问题,请参考以下文章