亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

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

Python socket 模塊:Recv() 數據響應切斷

Python socket 模塊:Recv() 數據響應切斷

開滿天機 2021-10-05 17:47:45
解釋我目前正在嘗試使用 python 腳本控制智能電源板。為了實現這一點,我使用了套接字模塊的 TCP 連接。大約 75% 的時間,我得到了我正在尋找的響應/數據,并且一切正常。然而,大約 25% 的時間,響應被截斷為完全相同的長度,1024 字節。這對我來說沒有任何意義,因為我的緩沖區大小實際上設置為 2048 字節。我在使用 recv() 之間等待的速度似乎也不會影響/導致這種情況。盡管 TCP 是字節流,但這是否仍然可能與數據包碎片有關?代碼主要代碼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解密函數def decrypt(string):    key = 171    result = ""    for i in string:        a = key ^ ord(i)        key = ord(i)        result += chr(a)    return result輸出我收到的字符串本身。它很可能不相關,但我想無論如何我都會包括它。這是變量rec的值。期望的和常規的輸出完整的所需輸出{"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 “longitude_i”: - 1222955, “latitude_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條經驗 獲得超9個贊

根據文檔, bufsize 參數僅指定要讀取的最大數據量:


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


為了確保完整的數據傳輸,可以使用這樣的函數,它等待套接字連接的結束(由 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)

另一個可能更適合您的應用程序的示例可能是等待固定的消息大?。ㄈ缒膯栴}所示為 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)


查看完整回答
反對 回復 2021-10-05
  • 3 回答
  • 0 關注
  • 600 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號