Python3.6:socket數(shù)據(jù)傳輸解決粘包問(wèn)題valueerror:invalid literal for int() with base 10:

在上一篇socket實(shí)現(xiàn)簡(jiǎn)單ssh客戶端中然遏,有的時(shí)候會(huì)出現(xiàn)這個(gè)錯(cuò)誤


這是因?yàn)殚L(zhǎng)度和字符串一起發(fā)送了苦始,長(zhǎng)度在轉(zhuǎn)整形的時(shí)候里面包含了字符串所出現(xiàn)的錯(cuò)誤坎匿,這是由于數(shù)據(jù)傳輸過(guò)程中出現(xiàn)粘包導(dǎo)致的年扩,兩條send語(yǔ)句緊挨著蚁廓,導(dǎo)致數(shù)據(jù)一起發(fā)送過(guò)去了

兩個(gè)send語(yǔ)句緊挨:

    # 發(fā)送返回值長(zhǎng)度
    conn.send(str(len(response.encode())).encode())  # len里面的response也要加一個(gè).encode()
    
    # 發(fā)送返回值
    conn.send(response.encode())

那我們應(yīng)該如何避免這種情況的發(fā)生呢?
可以看到厨幻,一共發(fā)送兩次數(shù)據(jù)相嵌,我們可以在第一次發(fā)送數(shù)據(jù)是讓客戶端隨便返回一些數(shù)據(jù),然后讓服務(wù)器在第一次發(fā)送完數(shù)據(jù)之后接受一次數(shù)據(jù)當(dāng)作第一次數(shù)據(jù)發(fā)送成功的確認(rèn)况脆,也就是:

1.在客戶端第一次接收到數(shù)據(jù)大小之后立刻給服務(wù)器發(fā)送一次任意簡(jiǎn)短數(shù)據(jù)當(dāng)作確認(rèn)信息
2.在服務(wù)器發(fā)送完第一次數(shù)據(jù)之后等待收取一次確認(rèn)信息饭宾,收到確認(rèn)信息后再進(jìn)行第二次的數(shù)據(jù)發(fā)送

服務(wù)器端

import socket
import os

# 生成socket實(shí)例
server = socket.socket()

# 綁定端口
server.bind(('localhost', 6969))

# 監(jiān)聽(tīng)端口
server.listen()

# 等待鏈接
conn, addr = server.accept()

# 進(jìn)入循環(huán)
while True:

    print('等待指令')

    # 接收指令
    data = conn.recv(1024)

    # 判斷data是否存在
    if not data:
        print('斷開(kāi)')
        break

    # os模塊獲取指令
    response = os.popen(data.decode()).read()  # 獲得返回 接受字符串,返回結(jié)果也是字符串

    # popen無(wú)法獲得錯(cuò)誤返回值格了,所以加一步判斷
    if len(response) == 0:
        response = 'Error'

    # 發(fā)送返回值長(zhǎng)度
    conn.send(str(len(response)).encode())  # 如果在win下len里面的response就必須也要加一個(gè)encode()

    # 放置粘包
    conn.recv(1024)

    # 發(fā)送返回值
    conn.send(response.encode())

    print('send done')

server.close()

客戶端

import socket

# 生成socket實(shí)例
client = socket.socket()

# 鏈接指定ip端口
client.connect(('localhost', 6969))

# 進(jìn)入循環(huán)
while True:

    # 獲得指令
    cmd = input('請(qǐng)輸入指令:').strip()

    # 指令為空繼續(xù)等待輸入
    if len(cmd) == 0:
        continue

    # 發(fā)送指令
    client.send(cmd.encode())

    # 獲得返回值長(zhǎng)度
    res_size = client.recv(1024).decode()

    # 發(fā)送確認(rèn)收到信息看铆,防治粘包
    client.send(b'111')

    print(res_size)

    # 字符串轉(zhuǎn)整型
    i_res_size = int(res_size)

    # 一次收1024,判斷收多少次盛末,每收一次用總長(zhǎng)度減去收到的長(zhǎng)度弹惦,只要剩余長(zhǎng)度大于0就一直收
    while i_res_size > 0:

        # 收取返回值,這里雖然寫(xiě)的1024但是每次收的有可能小于1024
        data = client.recv(1024)

        # 減去這一次收取的長(zhǎng)度
        i_res_size -= len(data)  # 這里不能-1024 因?yàn)閞ecv不一定每次都收1024 有可能小于1024

        # 打印返回值
        print(data.decode())

    # 假如剩余長(zhǎng)度小于等于0了說(shuō)明收完了
    else:

        # 打印收取返回值的總長(zhǎng)度
        print('response recv done...', res_size)

客戶端服務(wù)器端各加一行悄但,就能有效的避免粘包的出現(xiàn)肤频,粘包的情況會(huì)在數(shù)據(jù)傳輸中經(jīng)常出現(xiàn),所以要記住這個(gè)方法

轉(zhuǎn)載請(qǐng)注明出處

python自學(xué)技術(shù)互助扣扣群:670402334

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末算墨,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子汁雷,更是在濱河造成了極大的恐慌净嘀,老刑警劉巖报咳,帶你破解...
    沈念sama閱讀 211,743評(píng)論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異挖藏,居然都是意外死亡暑刃,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,296評(píng)論 3 385
  • 文/潘曉璐 我一進(jìn)店門(mén)膜眠,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)岩臣,“玉大人,你說(shuō)我怎么就攤上這事宵膨〖芑眩” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 157,285評(píng)論 0 348
  • 文/不壞的土叔 我叫張陵辟躏,是天一觀的道長(zhǎng)谷扣。 經(jīng)常有香客問(wèn)我,道長(zhǎng)捎琐,這世上最難降的妖魔是什么会涎? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 56,485評(píng)論 1 283
  • 正文 為了忘掉前任,我火速辦了婚禮瑞凑,結(jié)果婚禮上末秃,老公的妹妹穿的比我還像新娘。我一直安慰自己籽御,他們只是感情好练慕,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,581評(píng)論 6 386
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著篱蝇,像睡著了一般贺待。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上零截,一...
    開(kāi)封第一講書(shū)人閱讀 49,821評(píng)論 1 290
  • 那天麸塞,我揣著相機(jī)與錄音,去河邊找鬼涧衙。 笑死哪工,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的弧哎。 我是一名探鬼主播雁比,決...
    沈念sama閱讀 38,960評(píng)論 3 408
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼撤嫩!你這毒婦竟也來(lái)了偎捎?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 37,719評(píng)論 0 266
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎茴她,沒(méi)想到半個(gè)月后寻拂,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,186評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡丈牢,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,516評(píng)論 2 327
  • 正文 我和宋清朗相戀三年祭钉,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片己沛。...
    茶點(diǎn)故事閱讀 38,650評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡慌核,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出申尼,到底是詐尸還是另有隱情垮卓,我是刑警寧澤,帶...
    沈念sama閱讀 34,329評(píng)論 4 330
  • 正文 年R本政府宣布晶姊,位于F島的核電站扒接,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏们衙。R本人自食惡果不足惜钾怔,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,936評(píng)論 3 313
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望蒙挑。 院中可真熱鬧宗侦,春花似錦、人聲如沸忆蚀。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,757評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)馋袜。三九已至男旗,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間欣鳖,已是汗流浹背察皇。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 31,991評(píng)論 1 266
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留泽台,地道東北人什荣。 一個(gè)月前我還...
    沈念sama閱讀 46,370評(píng)論 2 360
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像怀酷,于是被迫代替她去往敵國(guó)和親稻爬。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,527評(píng)論 2 349

推薦閱讀更多精彩內(nèi)容