Python中Socket粘包问题的解决

服务器端

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()
原文地址:https://www.cnblogs.com/sdadx/p/9049730.html