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()
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· DeepSeek 解答了困扰我五年的技术问题
· 为什么说在企业级应用开发中,后端往往是效率杀手?
· 用 C# 插值字符串处理器写一个 sscanf
· Java 中堆内存和栈内存上的数据分布和特点
· 开发中对象命名的一点思考
· DeepSeek 解答了困扰我五年的技术问题。时代确实变了!
· PPT革命!DeepSeek+Kimi=N小时工作5分钟完成?
· What?废柴, 还在本地部署DeepSeek吗?Are you kidding?
· 赶AI大潮:在VSCode中使用DeepSeek及近百种模型的极简方法
· DeepSeek企业级部署实战指南:从服务器选型到Dify私有化落地