python 粘包问题的解决

socketserver 模块的使用与粘包问题的解决

基于tcp协议

服务端:

复制代码
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
import socketserver import subprocess import struct import json class MyRequestHandle(socketserver.BaseRequestHandler): def handle(self): while True: try: cmd=self.request.recv(1024) if cmd.decode('utf8') == 'q': break obj=subprocess.Popen(cmd.decode('utf8'),shell=True,stdout=subprocess.PIPE,stderr=subprocess.PIPE ) err_res=obj.stderr.read() std_res=obj.stdout.read() total_size=len(err_res)+len(std_res) head_dic={ 'file_name':'a.txt', 'total_size':total_size, 'md5':'asdfdfdfsd43432' } head_json=json.dumps(head_dic) head_dic_size=len(head_json) head_size=struct.pack('i',head_dic_size) self.request.send(head_size) self.request.send(head_json.encode('utf8')) self.request.send(std_res + err_res) except Exception: break self.request.close() s=socketserver.ThreadingTCPServer(('127.0.0.1',8080),MyRequestHandle) s.serve_forever()

客户端:

复制代码
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
import socket import struct import json client=socket.socket(socket.AF_INET,socket.SOCK_STREAM) client.connect(('127.0.0.1',8080)) while True: cmd=input('请输入命令(q退出):').strip() if len(cmd) == 0: continue client.send(cmd.encode('utf8')) if cmd == 'q': break head = client.recv(4) head_size=struct.unpack('i',head)[0] head_json=client.recv(head_size).decode('utf8') head_dic=json.loads(head_json) print(head_dic) total_size=head_dic['total_size'] recv_size=0 while recv_size < total_size: recv_data=client.recv(1024) recv_size+=len(recv_data) print(recv_data.decode('gbk'),end='') client.close()
posted @   Franciszw  阅读(136)  评论(0编辑  收藏  举报
编辑推荐:
· DeepSeek 解答了困扰我五年的技术问题
· 为什么说在企业级应用开发中,后端往往是效率杀手?
· 用 C# 插值字符串处理器写一个 sscanf
· Java 中堆内存和栈内存上的数据分布和特点
· 开发中对象命名的一点思考
阅读排行:
· DeepSeek 解答了困扰我五年的技术问题。时代确实变了!
· PPT革命!DeepSeek+Kimi=N小时工作5分钟完成?
· What?废柴, 还在本地部署DeepSeek吗?Are you kidding?
· 赶AI大潮:在VSCode中使用DeepSeek及近百种模型的极简方法
· DeepSeek企业级部署实战指南:从服务器选型到Dify私有化落地
点击右上角即可分享
微信分享提示
评论
收藏
关注
推荐
深色
回顶
展开