新聞中心
1、了解發(fā)送數(shù)據(jù)的大小,設(shè)置接收的大小,這樣就可以正好接收所有的數(shù)據(jù)。黏包問(wèn)題是由于tcp的優(yōu)化算法將兩個(gè)不太大的數(shù)據(jù)包組合在一起發(fā)送的。

創(chuàng)新互聯(lián)公司-專(zhuān)業(yè)網(wǎng)站定制、快速模板網(wǎng)站建設(shè)、高性?xún)r(jià)比遵義網(wǎng)站開(kāi)發(fā)、企業(yè)建站全套包干低至880元,成熟完善的模板庫(kù),直接使用。一站式遵義網(wǎng)站制作公司更省心,省錢(qián),快速模板網(wǎng)站建設(shè)找我們,業(yè)務(wù)覆蓋遵義地區(qū)。費(fèi)用合理售后完善,十余年實(shí)體公司更值得信賴(lài)。
這種情況通常發(fā)生在連續(xù)使用幾個(gè)send()時(shí)。
這是遠(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ù)長(zhǎng)度
conn.send(bytes('ok',encoding='utf-8'))
#發(fā)送一個(gè)確認(rèn)防止發(fā)送num的時(shí)候跟后面的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é)果是一個(gè)元組類(lèi)型取第一個(gè)數(shù)據(jù)
# conn.send(bytes('ok',encoding='utf-8'))
ret = conn.recv(num)
print(ret.decode('gbk'))
conn.close()
sk.close()
以上就是python解決黏包問(wèn)題的方法,希望對(duì)大家有所幫助。更多Python學(xué)習(xí)指路:創(chuàng)新互聯(lián)Python教程
本文教程操作環(huán)境:windows7系統(tǒng)、Python 3.9.1,DELL G3電腦。
網(wǎng)頁(yè)標(biāo)題:創(chuàng)新互聯(lián)Python教程:python如何解決黏包問(wèn)題
轉(zhuǎn)載源于:http://www.dlmjj.cn/article/cdedjoc.html


咨詢(xún)
建站咨詢(xún)
