掃二維碼與項(xiàng)目經(jīng)理溝通
我們在微信上24小時期待你的聲音
解答本文疑問/技術(shù)咨詢/運(yùn)營咨詢/技術(shù)建議/互聯(lián)網(wǎng)交流
1、了解發(fā)送數(shù)據(jù)的大小,設(shè)置接收的大小,這樣就可以正好接收所有的數(shù)據(jù)。黏包問題是由于tcp的優(yōu)化算法將兩個不太大的數(shù)據(jù)包組合在一起發(fā)送的。

創(chuàng)新互聯(lián)公司-專業(yè)網(wǎng)站定制、快速模板網(wǎng)站建設(shè)、高性價比遵義網(wǎng)站開發(fā)、企業(yè)建站全套包干低至880元,成熟完善的模板庫,直接使用。一站式遵義網(wǎng)站制作公司更省心,省錢,快速模板網(wǎng)站建設(shè)找我們,業(yè)務(wù)覆蓋遵義地區(qū)。費(fèi)用合理售后完善,十余年實(shí)體公司更值得信賴。
這種情況通常發(fā)生在連續(xù)使用幾個send()時。
這是遠(yuǎn)程執(zhí)行cmd命令并返回結(jié)果的程序
server端代碼
import struct
import socket
sk = socket.socket()
sk.bind(('127.0.0.1',8080))
sk.listen()
conn,addr = sk.accept()
while True:
cmd = input('>>>')
conn.send(bytes(cmd,encoding='utf-8'))
num = conn.recv(1024).decode('utf-8') #接收client端計(jì)算好的數(shù)據(jù)長度
conn.send(bytes('ok',encoding='utf-8'))
#發(fā)送一個確認(rèn)防止發(fā)送num的時候跟后面的send內(nèi)容合并了
ret = conn.recv(num)
print(ret.decode('gbk'))
conn.close()
sk.close()
2、使用struct模塊解決粘合現(xiàn)象。
server端代碼
#tcp黏包現(xiàn)象的解決 struct
import struct
import socket
sk = socket.socket()
sk.bind(('127.0.0.1',8080))
sk.listen()
conn,addr = sk.accept()
while True:
cmd = input('>>>')
conn.send(bytes(cmd,encoding='utf-8'))
# num = conn.recv(1024).decode('utf-8')
num = conn.recv(1024) #接收數(shù)據(jù)
num = struct.unpack('i',num)[0]#進(jìn)行解包,解包的結(jié)果是一個元組類型取第一個數(shù)據(jù)
# conn.send(bytes('ok',encoding='utf-8'))
ret = conn.recv(num)
print(ret.decode('gbk'))
conn.close()
sk.close()
以上就是python解決黏包問題的方法,希望對大家有所幫助。更多Python學(xué)習(xí)指路:創(chuàng)新互聯(lián)Python教程
本文教程操作環(huán)境:windows7系統(tǒng)、Python 3.9.1,DELL G3電腦。

我們在微信上24小時期待你的聲音
解答本文疑問/技術(shù)咨詢/運(yùn)營咨詢/技術(shù)建議/互聯(lián)網(wǎng)交流