解決粘包問題

服務端


# 服務端應該滿足兩個特點:
# 1、一直對外提供服務
# 2绎狭、并發(fā)地服務多個客戶端
import subprocess
import struct
import json
from socket import *

server=socket(AF_INET,SOCK_STREAM)
server.setsockopt(SOL_SOCKET,SO_REUSEADDR,1) #就是它治专,在bind前加
server.bind(('127.0.0.1',8089))
server.listen(5)

#  服務端應該做兩件事
# 第一件事:循環(huán)地從板連接池中取出鏈接請求與其建立雙向鏈接,拿到鏈接對象
while True:
    conn,client_addr=server.accept()

    # 第二件事:拿到鏈接對象故痊,與其進行通信循環(huán)
    while True:
        try:
            cmd=conn.recv(1024)
            if len(cmd) == 0:break
            obj=subprocess.Popen(cmd.decode('utf-8'),
                             shell=True,
                             stdout=subprocess.PIPE,
                             stderr=subprocess.PIPE
                             )

            stdout_res=obj.stdout.read()
            stderr_res=obj.stderr.read()
            total_size=len(stdout_res)+len(stderr_res)

            # 1顶瞳、制作頭
            header_dic={
                "filename":"a.txt",
                "total_size":total_size,
                "md5":"123123xi12ix12"
            }
            
            # 字典轉字符
            json_str = json.dumps(header_dic)
            json_str_bytes = json_str.encode('utf-8')


            # 2、先把頭的長度發(fā)過去
            x=struct.pack('i',len(json_str_bytes))
            conn.send(x)

            # 3愕秫、發(fā)頭信息
            conn.send(json_str_bytes)
            # 4慨菱、再發(fā)真實的數據
            conn.send(stdout_res)
            conn.send(stderr_res)

        except Exception:
            break
    conn.close()

客戶端

import struct
import json
from socket import *

client=socket(AF_INET,SOCK_STREAM)
client.connect(('127.0.0.1',8089))

while True:
    cmd=input('請輸入命令>>:').strip()
    if len(cmd) == 0:continue
    client.send(cmd.encode('utf-8'))

    # 接收端
    # 1、先手4個字節(jié)戴甩,從中提取接下來要收的頭的長度
    x=client.recv(4)
    header_len=struct.unpack('i',x)[0]

    # 2符喝、接收頭,并解析
    json_str_bytes=client.recv(header_len)
    json_str=json_str_bytes.decode('utf-8')      # 轉為json
    header_dic=json.loads(json_str)              # 轉為字典
    print(header_dic)
    total_size=header_dic["total_size"]

    # 3甜孤、接收真實的數據
    recv_size = 0
    while recv_size < total_size:
        recv_data=client.recv(1024)
        recv_size+=len(recv_data)         # 真實數據為协饲,每次現有的數據加上沒有傳輸過來的字節(jié)長度(不難直接+1024,可能網絡延遲一次只收到2個bytes)
        print(recv_data.decode('utf-8'),end='')
    else:
        print()


# 粘包問題出現的原因
# 1缴川、tcp是流式協議茉稠,數據像水流一樣粘在一起,沒有任何邊界區(qū)分
# 2把夸、收數據沒收干凈而线,有殘留,就會下一次結果混淆在一起

# 解決的核心法門就是:每次都收干凈,不要任何殘留

執(zhí)行

/usr/local/bin/python3 "/Users/客戶端.py"
請輸入命令>>:ls
{'filename': 'a.txt', 'total_size': 34, 'md5': '123123xi12ix12'}
test.py
客戶端.py
服務端.py

轉自egon大佬博客膀篮!

https://www.cnblogs.com/linhaifeng/articles/6129246.html

?著作權歸作者所有,轉載或內容合作請聯系作者
  • 序言:七十年代末嘹狞,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子誓竿,更是在濱河造成了極大的恐慌磅网,老刑警劉巖,帶你破解...
    沈念sama閱讀 211,639評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件筷屡,死亡現場離奇詭異涧偷,居然都是意外死亡,警方通過查閱死者的電腦和手機速蕊,發(fā)現死者居然都...
    沈念sama閱讀 90,277評論 3 385
  • 文/潘曉璐 我一進店門嫂丙,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人规哲,你說我怎么就攤上這事跟啤。” “怎么了唉锌?”我有些...
    開封第一講書人閱讀 157,221評論 0 348
  • 文/不壞的土叔 我叫張陵隅肥,是天一觀的道長。 經常有香客問我袄简,道長腥放,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,474評論 1 283
  • 正文 為了忘掉前任绿语,我火速辦了婚禮秃症,結果婚禮上,老公的妹妹穿的比我還像新娘吕粹。我一直安慰自己种柑,他們只是感情好,可當我...
    茶點故事閱讀 65,570評論 6 386
  • 文/花漫 我一把揭開白布匹耕。 她就那樣靜靜地躺著聚请,像睡著了一般。 火紅的嫁衣襯著肌膚如雪稳其。 梳的紋絲不亂的頭發(fā)上驶赏,一...
    開封第一講書人閱讀 49,816評論 1 290
  • 那天,我揣著相機與錄音既鞠,去河邊找鬼煤傍。 笑死,一個胖子當著我的面吹牛嘱蛋,可吹牛的內容都是我干的蚯姆。 我是一名探鬼主播椅寺,決...
    沈念sama閱讀 38,957評論 3 408
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼蒋失!你這毒婦竟也來了?” 一聲冷哼從身側響起桐玻,我...
    開封第一講書人閱讀 37,718評論 0 266
  • 序言:老撾萬榮一對情侶失蹤篙挽,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后镊靴,有當地人在樹林里發(fā)現了一具尸體铣卡,經...
    沈念sama閱讀 44,176評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 36,511評論 2 327
  • 正文 我和宋清朗相戀三年偏竟,在試婚紗的時候發(fā)現自己被綠了煮落。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,646評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡踊谋,死狀恐怖蝉仇,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情殖蚕,我是刑警寧澤轿衔,帶...
    沈念sama閱讀 34,322評論 4 330
  • 正文 年R本政府宣布,位于F島的核電站睦疫,受9級特大地震影響害驹,放射性物質發(fā)生泄漏。R本人自食惡果不足惜蛤育,卻給世界環(huán)境...
    茶點故事閱讀 39,934評論 3 313
  • 文/蒙蒙 一宛官、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧瓦糕,春花似錦底洗、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,755評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至谭胚,卻和暖如春徐块,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背灾而。 一陣腳步聲響...
    開封第一講書人閱讀 31,987評論 1 266
  • 我被黑心中介騙來泰國打工胡控, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人旁趟。 一個月前我還...
    沈念sama閱讀 46,358評論 2 360
  • 正文 我出身青樓昼激,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子橙困,可洞房花燭夜當晚...
    茶點故事閱讀 43,514評論 2 348

推薦閱讀更多精彩內容