44.聊天类软件后台架构及请求数据设计

一,服务端功能设计:

一,服务端功能

  • 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的数据体
  • 3:判断ID:
    • ID不重复:登陆保存
    • ID重复:直接关闭套接字
  • 4:成功登陆的用户保存在字典中的数据结构体
    • #字典:
          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 查看本文章

猜你喜欢

转载自www.cnblogs.com/zhangan/p/10364887.html