第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

Python socket 模塊:Recv() 數(shù)據(jù)響應(yīng)切斷

Python socket 模塊:Recv() 數(shù)據(jù)響應(yīng)切斷

開滿天機 2021-10-05 17:47:45
解釋我目前正在嘗試使用 python 腳本控制智能電源板。為了實現(xiàn)這一點,我使用了套接字模塊的 TCP 連接。大約 75% 的時間,我得到了我正在尋找的響應(yīng)/數(shù)據(jù),并且一切正常。然而,大約 25% 的時間,響應(yīng)被截斷為完全相同的長度,1024 字節(jié)。這對我來說沒有任何意義,因為我的緩沖區(qū)大小實際上設(shè)置為 2048 字節(jié)。我在使用 recv() 之間等待的速度似乎也不會影響/導(dǎo)致這種情況。盡管 TCP 是字節(jié)流,但這是否仍然可能與數(shù)據(jù)包碎片有關(guān)?代碼主要代碼ip='192.168.0.62'port=9999sock_tcp = socket.socket(socket.AF_INET, socket.SOCK_STREAM)sock_tcp.connect((ip, port))sock_tcp.send(encrypt('{"system":{"get_sysinfo":{}}}'))data = sock_tcp.recv(2048)sock_tcp.close()print len(data) #On succesful runs output is 1221, on unsuccesful runs it is 1024rec = decrypt(data[4:])print str(rec) #See output below加密功能def encrypt(string):    key = 171    result = pack('>I', len(string))    for i in string:        a = key ^ ord(i)        key = a        result += chr(a)    return result解密函數(shù)def decrypt(string):    key = 171    result = ""    for i in string:        a = key ^ ord(i)        key = ord(i)        result += chr(a)    return result輸出我收到的字符串本身。它很可能不相關(guān),但我想無論如何我都會包括它。這是變量rec的值。期望的和常規(guī)的輸出完整的所需輸出{"system":{"get_sysinfo":{"sw_ver":"1.0.6 Build 180627 Rel.081000","hw_ver":"1.0","model":"HS300(US)","deviceId":" 80067B24A755F99C4D6C1807455E09F91AB7B2AA”, “OEMID”: “5C9E6254BEBAED63B2B6102966D24C17”, “HWID”: “34C41AA028022D0CCEA5E678E8547C54”, “RSSI” - 60 “l(fā)ongitude_i”: - 1222955, “l(fā)atitude_i”:379078, “別名”: “TP-LINK_Power Strip_4F01” "mic_type":"IOT.SMARTPLUGSWITCH","feature":"TIM:ENE","mac":"B0:BE:76:12:4F:01","更新":0,"led_off":0, "兒童":[{"id":"80067B24A755F99C4D6C1807455E09F91AB7B2AA00","state":0,"alias":"CezHeat","on_time":0,"next_action":{"type":-1}},{"id":"80067B24A755F99C4D6C1807455E09F91AB7B2AA01","state":1,"alias":"CezUVB","on_time8",1 next_action":{"type":-1}},{"id":"80067B24A755F99C4D6C1807455E09F91AB7B2AA02","state":1,"alias":"CyanHeat","on_time":191208":"type_next_action" :-1}},
查看完整描述

3 回答

?
千萬里不及你

TA貢獻1784條經(jīng)驗 獲得超9個贊

根據(jù)文檔, bufsize 參數(shù)僅指定要讀取的最大數(shù)據(jù)量:


socket.recv(bufsize[, flags]) 從套接字接收數(shù)據(jù)。返回值是一個字節(jié)對象,表示接收到的數(shù)據(jù)。一次接收的最大數(shù)據(jù)量由 bufsize 指定。有關(guān)可選參數(shù)標(biāo)志的含義,請參閱 Unix 手冊頁 recv(2);它默認(rèn)為零。


為了確保完整的數(shù)據(jù)傳輸,可以使用這樣的函數(shù),它等待套接字連接的結(jié)束(由 recv 返回的空字符串表示):


def recv_all(connection):

    """

    Function for all data


    :param connection: socket connection

    :return: received data

    """

    data = list()

    while True:

        data.append(connection.recv(2048))

        if not data[-1]:

            return b''.join(data)

另一個可能更適合您的應(yīng)用程序的示例可能是等待固定的消息大小(如您的問題所示為 1221):


def recv_message(connection):

    data = list()

    transferred_bytes= 0

    while transferred_bytes < 1221:

        data.append(connection.recv(min(1221-transferred_bytes, 2048)))

        if not data[-1]:

            raise RuntimeError("socket connection broken")

        transferred_bytes += len(data[-1])

    return b''.join(data)


查看完整回答
反對 回復(fù) 2021-10-05
  • 3 回答
  • 0 關(guān)注
  • 589 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動學(xué)習(xí)伙伴

公眾號

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號