簡體   English   中英

Python套接字未發送完整數據

[英]Python Sockets Not Sending Full Data

我有一個客戶端服務器應用程序,其中客戶端與服務器位於不同的盒子上。 當發送小數據包時,來自客戶端的所有數據都會發送到服務器,反之亦然。 客戶端需要向服務器發送狀態報告,該狀態報告的長度為43175字節,服務器需要發送類似大小的指令。 在43175字節的數據包中,只有11711字節進入了服務器。

所有數據包均已設置,因此第一行是數據包的長度(以字節為單位),后跟數據包。

import socket, sys

# recv expects the first line to the the integer length of the following packet data
# this would look like
#
# 12
# Hello World!
#

def recv(socket):
    char = ''
    num = ''
    while char != '\n':
        num += char
        char = socket.recv(1)

        if char:
            dummy=1
        else:
            return False
    text = socket.recv(int(num))
    if sys.getsizeof(text) < int(num):
        print("The received packet was not the length the heading specified: " + str(sys.getsizeof(text)) + " ~ " + num)

    return text

“收到的數據包不是指定的標題長度:11711〜43175”

發送過程看起來像這樣-

def emit(socket, packet):
    send = str(packet.length()) + "\n" + str(packet)
    socket.send(send)

# packet class in another file

import json, sys

class Packet:
    def __init__(self, name, data):
        self.name = name
        self.data = data

    def length(self):
        return sys.getsizeof(self.__str__())

    def __str__(self):
        obj = {"name":self.name,"data":self.data}
        return json.dumps(obj)

我還在客戶端和服務器套接字上設置了一個持久的sockopt,但這沒有幫助-

self.socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
self.socket.connect((self.host, self.port))

linger_struct = struct.pack("ii", 1, 10)
self.socket.setsockopt(socket.SOL_SOCKET, socket.SO_LINGER, linger_struct)

為什么會發生這種情況,我該怎么辦? 還有其他人有類似的問題嗎?

使用TCP套接字時,不能保證收到您所要求的全部信息,但收到的可能更少。 您可能必須循環接收才能接收所有內容。

從Joachim的建議和堆棧上發現的其他帖子溢出,recv長度僅是可以接收的數量的上限。 recv不會等到數據被提取后再繼續,因此它持續不足。 為了解決這個問題,我會跟蹤我提取的數量,而提取的數量與預期的循環接收數量並不相等,直到獲得所有期望的數據。

完美地工作。

謝謝大家的幫助。

編輯:

還將代碼中的所有sys.getsizeof更改為len(在recv和數據包中)。 sys.getsizeof無法正常工作。

def recv(socket):
    char = ''
    num = ''
    while char != '\n':
        num += char
        char = socket.recv(1)

        if char:
            dummy=1
        else:
            return False

    expectedlength = int(num)
    recvlength = 0

    text = ""
    while expectedlength-recvlength > 0:
        text += socket.recv(expectedlength-recvlength)
        recvlength = len(text)

    return text

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM