[英]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.