鱼C论坛

 找回密码
 立即注册
查看: 2608|回复: 1

Python socketserver求助:服务端读取不同位置的报文,print出来是一样的

[复制链接]
发表于 2022-11-6 14:05:33 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x

问题描述:服务端读取报文头、报文体都没问题,但是读取报文尾的时候,内容是跟报文体是一样的,求大神指导

报文 = 报文头(标识报文体长度) + 报文体 + 报文尾(标识报文体的hash值,用于校验报文是否被篡改)

客户端
  1. import socket
  2. import time
  3. import json
  4. import traceback


  5. def connect(ip, port):
  6.     server_ip = ip
  7.     server_port = port
  8.     tcp_client = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
  9.     try:
  10.         tcp_client.connect((server_ip, server_port))
  11.     except socket.error:
  12.         print('连接失败!!!')
  13.     return tcp_client


  14. def recv_msg(conn, length: int):
  15.     ret_msg = bytes()
  16.     recv_len = length
  17.     while recv_len > 0:
  18.         msg = conn.recv(recv_len)
  19.         ret_msg += msg
  20.         cur_len = len(msg)
  21.         recv_len -= cur_len
  22.     return ret_msg


  23. def send_msg(tcp_client):
  24.     try:
  25.         data = dict()
  26.         data['name'] = 'login'
  27.         data['user_id'] = '8888'
  28.         data['password'] = '123456'
  29.         # for i in range(1000):
  30.         #     data['demo_field_{}'.format(
  31.         #         i)] = 'sdflakswdfnasdlfkjalnsdfknalksdjflkjaslkdfjlksajdflkjalksdfjlkasjdfklajslkdfjklsadjflks_{}'.format(
  32.         #         i)

  33.         data['time'] = time.strftime("%Y-%m-%d")
  34.         # dict转json
  35.         str_json = json.dumps(data)
  36.         # 计算长度
  37.         length = len(str_json)
  38.         head = length.to_bytes(4, byteorder='big', signed=False)
  39.         #计算hash值
  40.         client_hash = "{:0>20}".format(str(hash(str_json)))
  41.         # 拼装报文头与报文体
  42.         msg = head + str_json.encode('utf-8') + client_hash.encode('utf-8')
  43.         print(msg)
  44.         tcp_client.send(msg)

  45.         # 1.先接收头四位报文头
  46.         len_msg = tcp_client.recv(4)
  47.         length = int.from_bytes(len_msg, byteorder='big', signed=False)

  48.         print('客户端收到报文长度:{}'.format(length))
  49.         # 2.再接收报文体
  50.         req_msg = recv_msg(tcp_client, length)
  51.         json_str = str(req_msg, encoding='utf-8')
  52.         print('客户端收到报文str:{}'.format(json_str))
  53.         req_msg_dict = json.loads(json_str)
  54.         # print('客户端收到报文dict:{}'.format(req_msg_dict))
  55.     except Exception as e:
  56.         print('连接失败!!!')
  57.         traceback.print_exc()
  58.         raise e


  59. IP = '127.0.0.1'
  60. PORT = 12581
  61. if __name__ == '__main__':
  62.     conn = connect(ip=IP, port=PORT)
  63.     send_msg(conn)
  64.     conn.close()
复制代码



服务端
  1. from socketserver import ThreadingTCPServer
  2. from socketserver import StreamRequestHandler
  3. import json
  4. import traceback


  5. def recv_msg(conn, length: int):
  6.     ret_msg = bytes()
  7.     recv_len = length
  8.     while recv_len > 0:
  9.         msg = conn.read(recv_len)
  10.         ret_msg += msg
  11.         cur_len = len(msg)
  12.         recv_len -= cur_len
  13.     return ret_msg


  14. class MyStreamRequestHandler(StreamRequestHandler):

  15.     def handle(self):
  16.         print('连接上来啦, 连接号:[{0}]'.format(self.wfile))
  17.         while True:
  18.             try:
  19.                 print("等待客户端发送报文...")
  20.                 # 1.先接收头四位报文头
  21.                 len_msg = self.rfile.read(4)
  22.                 if len_msg:
  23.                     length = int.from_bytes(len_msg, byteorder='big', signed=False)
  24.                     print('服务端收到报文长度:{}'.format(length))
  25.                     # 2.再接收报文体
  26.                     req_msg = recv_msg(self.rfile, length)
  27.                     # req_msg = self.rfile.read(length)
  28.                     #接收报文尾
  29.                     req_hash = str(self.rfile.read(20),encoding='utf-8')
  30.                     json_str = str(req_msg, encoding='utf-8')
  31.                     print('服务端收到报文str:{}'.format(json_str))
  32.                     print('服务端收到hash:{}'.format(req_hash))
  33.                     req_msg_dict = json.loads(str(req_msg, encoding='utf-8'))
  34.                     # print('服务端收到报文dict:{}'.format(req_msg_dict))
  35.                     # 发送应答
  36.                     head = length.to_bytes(4, byteorder='big', signed=False)
  37.                     rsp_msg = head + bytes(json.dumps(req_msg_dict), encoding='utf-8')
  38.                     print('服务端发送应答报文:{}'.format(rsp_msg))
  39.                     self.wfile.write(rsp_msg)
  40.                 else:
  41.                     # 客户端主动断开后,req_msg是b''
  42.                     print('连接已断开, 连接号:[{0}]'.format(self.wfile))
  43.                     break
  44.             except Exception as e:
  45.                 print('Socket异常:{}'.format(e))
  46.                 traceback.print_exc()
  47.                 break

  48.         self.request.close()


  49. def start_server(port: int):
  50.     # 设置IP 和 Port
  51.     addr = ('0.0.0.0', port)
  52.     # 使用socketserver库
  53.     server = ThreadingTCPServer(addr, MyStreamRequestHandler)
  54.     # 启动服务,线程挂起
  55.     server.serve_forever()


  56. PORT = 12581
  57. if __name__ == '__main__':
  58.     print("启动服务端!!!")
  59.     start_server(PORT)
  60.     print("服务端关闭")
复制代码

小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2022-11-6 14:20:08 | 显示全部楼层
原理--不知道,但是原因好像是我改了服务端但是没有重启服务端的原因
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-4-26 01:03

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表