解决方法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()