1. 程式人生 > >Python網絡編程之黏包問題

Python網絡編程之黏包問題

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(bok) # 接受到消息大小後馬上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網絡編程之黏包問題