Python中Socket粘包问题的解决
2024-10-18 23:27:01
服务器端
import socket
import subprocess
import struct
server = socket.socket()
ip_port = ("192.168.15.33",8001)
server.bind(ip_port)
server.listen()
conn,addr = server.accept() while 1:
print("等待接收消息...")
from_client_cmd = conn.recv(1024).decode("utf-8")#接收客户端消息
print(from_client_cmd) sub_obj = subprocess.Popen( #通过subprocess模块执行服务端指令,并拿到指令结果
from_client_cmd, #客户端指令
shell = True,
stdout = subprocess.PIPE, #标准输出:正确指令的执行结果
stderr = subprocess.PIPE, #标准错误输出:错误指令的执行结果
) server_cmd_msg = sub_obj.stdout.read()
#server_cmd_msg = sub_obj.stderr.read() #接收到的返回信息是bytes类型,并且windoes系统的默认编码为gbk
cmd_msg_len = len(server_cmd_msg) #计算你要发送的数据长度
msg_len_stru = struct.pack("i",cmd_msg_len)#先对数据长度进行打包,打包成4个字节的数据,目的是为了和你将要发送的数据拼接在一起,就像我们自制一个消息头.
conn.send(msg_len_stru) #首先发送打包成功后的那4个字节的数据
conn.sendall(server_cmd_msg) #循环send数据,直到数据全部发送成功 conn.close()
server.close()
客户器端
import socket
import struct
client = socket.socket()
server_ip_port = ("192.168.15.33",8001)
client.connect(server_ip_port) while 1:
msg = input("请输入要执行的命令>>>>>")
client.send(msg.encode("utf-8")) from_server_msglen = client.recv(4)#先接受服务端要发送给我的数据长度,前四个字节,固定的
unpack_len_msg = struct.unpack("i",from_server_msglen)[0] recv_msg_len = 0
all_msg = b""
while recv_msg_len < unpack_len_msg:
every_recv_date = client.recv(1024)
all_msg += every_recv_date #将每次接收到的数据进行拼接和统计
recv_msg_len += len(every_recv_date) #对每次接受到的数据进行累加 print(all_msg.decode("gbk"))
client.close()
最新文章
- ant使用指南详细入门教程
- python常见错误总结
- 图像特征提取三大法宝:HOG特征,LBP特征,Haar特征
- Laravel教程:laravel 4安装及入门
- Monkey学习笔记<;四>;:Monkey服务器命令
- BZOJ 3196
- 笔记整理——linux程序设计
- JPA、Hibernate框架、通用mapper
- 解决Jenkins用shell脚本部署后,Jenkins自动杀掉启衍生出来的守护进程
- [MySQL]多表关联查询技巧
- 无法获得锁 /var/lib/dpkg/lock - open (11: 资源暂时不可用) ...ubuntu 18.04 安装vim遇到的错误
- poj2965 【枚举】
- xml的解析方式的简介
- 802.11 af 要点
- SQLServer&#160;学习笔记之超详细基础SQL语句&#160;Part&#160;7
- Security5:授予权限
- 国内首款 FPGA 云服务器,性能是通用 CPU 服务器 30 倍以上
- LightOJ 1355 :Game of CS(树上green博弈)
- 洛谷P3396哈希冲突
- linux centos7 erlang rabbitmq安装