Python網絡編程之黏包問題
阿新 • • 發佈:2019-02-24
add read proc import accept inpu sub serve 編程
二、解決黏包問題
2.1 解決黏包方法1
- 計算消息實體的大小
- 服務端接受兩次,一次時消息大小,二次是消息實體,解決消息實體黏包
- 客戶端發送兩次,一次是消息大小,一次是消息實體
- 在兩次收發之間加入一次多余通信,以防止消息大小和消息實體黏包
server端
import socket sk = socket.socket() sk.bind((‘127.0.0.1‘,9000)) sk.listen() conn,addr = sk.accept() print(conn,addr) while True: cmd = input(‘請輸入你的命令: ‘) if cmd == ‘q‘: break conn.send(cmd.encode(‘gbk‘)) data_length = conn.recv(1024).decode(‘gbk‘) conn.send(b‘ok‘) # 接受到消息大小後馬上send,這樣可以隔開兩次recv,並且第二次接受指定長度的消息 data = conn.recv(int(data_length)).decode(‘gbk‘) print(data) conn.close() sk.close()
client
import socket import subprocess sk= socket.socket() sk.connect((‘127.0.0.1‘,9000)) while True: cmd = sk.recv(1024).decode(‘gbk‘) ret = subprocess.Popen(cmd,shell=True,stdout=subprocess.PIPE,stderr=subprocess.PIPE) std_out = ret.stdout.read() std_err = ret.stderr.read() data_length = str(len(std_out)+len(std_err)).encode(‘gbk‘) sk.send(data_length) sk.recv(1024) # send消息大小後馬上轉入recv,隔開兩次send。 sk.send(std_out) sk.send(std_err) sk.close()
Python網絡編程之黏包問題