Python解决Socket粘包

解决方法1:

 在容易产生粘包的语句中间添加 time.sleep() ,时间设置在1秒以内即可

代码如下:

import socket,os,time

server =socket.socket()
server.bind(('0.0.0.0',6666))
server.listen()
print("等待....")
while True:
    conn,addr = server.accept()
    print("new conn:",conn)
    while True:
         data = conn.recv(1024)
         if not data:
             print("client is disconnection")
             break
         cmd_res = os.popen(data.decode()).read()
         print("before send: ",len(cmd_res.encode("utf-8")))
         if len(cmd_res)==0:
             cmd_res = "cmd has no output...."
         conn.send(str(len(cmd_res.encode())).encode("utf-8"))
         time.sleep( 0.5 )        #此行的上下语句容易产生粘包
         conn.send(cmd_res.encode("utf-8"))
         print("send done")

server.close()

此方法只适合比较简易的环境下,且对时间要求不高的程序。

解决方法2:

       第二种方法是在客户端发生粘包情况的语句中间,添加一次客户端与服务端交互的指令。此次是服务器端接收一次客户端的返回信息。如果客户端不返回信息,服务器就卡住等待。这样实现的休眠方法,比自己手动固定休眠时间要人性化些,可以大大提高效率。

客户端代码:

import socket,os,time

server =socket.socket()
server.bind(('0.0.0.0',6666))
server.listen()
print("等待....")
while True:
    conn,addr = server.accept()
    print("new conn:",conn)
    while True:
         data = conn.recv(1024)
         if not data:
             print("client is disconnection")
             break
         cmd_res = os.popen(data.decode()).read()
         print("before send: ",len(cmd_res.encode("utf-8")))
         if len(cmd_res)==0:
             cmd_res = "cmd has no output...."
         conn.send(str(len(cmd_res.encode())).encode("utf-8"))

         back_info = conn.recv(1024)    #此次接收命令,只是休眠等待的作用

         conn.send(cmd_res.encode("utf-8"))
         print("send done")

server.close()

客户端代码:

import socket

client = socket.socket()

client.connect(("0.0.0.0",6666))

while True:
    cmd = input(">>>:").strip()

    if len(cmd)==0 :continue

    client.send(cmd.encode("utf-8"))

    file_size = int(client.recv(1024))

    client.send("go go go".encode())      #此行代码是用来响应客户端 back_info

    print("文件大小:",file_size)
    recv_size = 0
    while file_size > recv_size:
        cmd_res = client.recv(1024)
        if len(cmd_res)==0:
            continue
        # print(cmd_res.decode())
        recv_size += len(cmd_res)
        print(recv_size)
    else:
        print("cmd_res has received",recv_size)

client.close()


猜你喜欢

转载自blog.csdn.net/zjt980452483/article/details/79809627