一,服务端功能设计:
一,服务端功能
1:接收用户登陆
主线程,消息收集 服务端套接字,唯一ID的校验 2:告知在线用户
另开线程,遍历访问服务端保存的客户端序列数据
3:处理在线用户的消息发送
- 主线程,消息收集 一旦捕获到了一个消息是要发送给别人的
- 另开线程,处理消息转发,发给另外一个在线的套接字
二,客户端功能
1:登陆
套接字,发送ID和昵称即可 2:接收处理服务端发来的在线用户列表 3:发送消息,展示消息
三,请求数据结构体 / 客户端
- 1:pickle.dumps() #打包二进制数据体
{ #客户端登陆数据体 'flag': 'login', #数据标志位 'data': { 'id': '123456', #用户ID 'passwd: 'xxxxx', #用户密码 } } { #客户端发送数据体 'flag': 'send' #数据标志位 'data': { 'send_id': '123455', #发送者的ID 'recv_id': '123456', #接收人的ID号 'message: 'xxxxx', #发给别人的数据 } } { #客户端注册数据体 'flag': 'register', #数据标志位 'data': { 'id': '123456', #用户ID 'password': 'xxxxx', # } }
四,服务端保存在线用户数据体
1:直接连进来的,不进入这个数据体,不算有效用户 2:某个线程,捕捉这个套接字发来的第一个login的数据体- 4:成功登陆的用户保存在字典中的数据结构体
3:判断ID:
- ID不重复:登陆保存
- ID重复:直接关闭套接字
#字典: dict_onlien_user = { id1:{ 'socket':client, }, id2:{, 'socket':client, }, } #dict_onlien_user.get(recv_id)['socket'].send(message) #如果再转发消息的时候,准确快速的找到接收者
- 5:成功的用户发来的数据,要给别人发消息,服务端怎么保存这个数据?
{ #发送数据体 'flag': 'send' #数据标志位 'data': { 'send_id': '123455', #发送者的ID 'recv_id': '123456', #接收人的ID号 'message: 'xxxxx', #发给别人的数据 } }
- 6:客户端接收服务端发来的在线用户数据结构体
list_onlien_user = ['id1','id2','id3']
- 7: 发给其他用户的数据,怎么发过去?
{ #服务端发给客户端的数据体 'flag': 'forword' #数据标志位 'data': { 'send_id': '123455', #发送者的ID 'message': '123456', #发送的消息 } }
五,代码编写如下:
扫描二维码关注公众号,回复: 5162419 查看本文章