基于 https://blog.csdn.net/ns2250225/article/details/81322292 修改而成。
1.clinet 增加了一个线程用于发送信息
2.client支持显示中文信息
3.增加了一个群发的处理函数。
原文中 有两个地方比较费解
1.handler 使用了元类。初始化的时候会生成一个dict字典_msg_handlers ,这个字典里面用__msgtype__这个变量做key,存放类型为MetaHandler的类( ErrorHandler 、Register、SendTextMsg、Unregister ), 通过接收的msg的type调用不同的handle处理收到的msg。
2.server 对接收的bytes的处理process data。
运行环境win10 x64,python 3.7.4 x64,工具visual studio 2019 企业版 (断点挺好用的,可以看清楚各个变量的当前值,推荐-。期待.net Core 3.0)。
先运行 服务器server.py 然后打开几个客户端newclient.py 就可以了。
上面是运行的情况
只放服务端代码和客户端代码 其他还有几个类就不放出了 直接下载就可以了
服务器端
import asyncio
import json
from handlers import MessageHandler
# 消息頭長度 int or uint
_MESSAGE_PREFIX_LENGTH = 4
# 字節序
_BYTE_ORDER = 'big'
class myImProtocol(asyncio.Protocol):
_buffer = b'' # 數據緩衝Buffer
_msg_len = None # 消息長度
def data_received(self, data):
while data:
data = self.process_data(data)
def process_data(self, data):
"""
Called when some data is received.
This method must be implemented by subclasses
The argument is a bytes object.
"""
self._buffer += data
# For store the rest data out-of a full message
_buffer = None
if self._msg_len is None:
# If buffer length < _MESSAGE_PREFIX_LENGTH return for more data
if len(self._buffer) < _MESSAGE_PREFIX_LENGTH:
return
# If buffer length >= _MESSAGE_PREFIX_LENGTH
self._msg_len = int.from_bytes(self._buffer[:_MESSAGE_PREFIX_LENGTH], byteorder=_BYTE_ORDER)
# The left bytes will be the message body
self._buffer = self._buffer[_MESSAGE_PREFIX_LENGTH