UDP 服务器套接字无法解析所有接收到的数据
UDP server socket can't parse all received data
我正在使用 UDP 实现客户端-服务器模型。客户端向服务器端发送数据,服务器端除了接收数据外,还需要进行解析。现在,如果我在收到数据后不解析数据,服务器会将 100% 的数据写入文件。但是在解析它时,它会延迟并且一些数据不会写入输出文件。
服务器代码:
while True:
data, addr = s.recvfrom(1024)
#I used pickle since the data is an array
csv_writer.writerow(pickle.loads(data))
#Stating to parse the data now:
arr = pickle.loads(data) <---- The data I need to parse is an array
# If the key exists in the dictionary,
# increment the value by one
currentMessageID = arr[0]
if (dictOfMessageID.has_key(currentMessageID)):
dictOfMessageID[currentMessageID] += 1
# # If the key doesn't exists in dictionary
# # add the key-value pair
else:
dictOfMessageID[currentMessageID] = 1
我该如何解决这个问题?服务器仍然需要写入所有数据并解析它
还是我遗漏了什么,在这种情况下 UDP 数据包会丢失?
我要尝试的第一件事是增加您的 UDP 套接字的传入数据缓冲区(例如通过 sock.setsockopt(socket.SOL_SOCKET, socket.SO_RCVBUF, 128*1024)
),以减少在您解析数据时它溢出的可能性。
如果这还不够,通过更多的工作,您可以通过将接收到的数据包添加到 list/Queue(而不是立即解析它们)并稍后解析它们来分离数据的接收和解析(在接收到所有数据包之后)或在单独的(低优先级)线程中,以便接收传入的数据包不会延迟。
如果这仍然不能给您足够的可靠性,那么您可能需要重新设计您的系统以使用 TCP 流而不是 UDP 数据包,因为 TCP 流会自动降低传输速度以匹配接收程序的速度, 并将根据需要自动重新发送数据包 if/when 它们会因任何原因被丢弃。
请注意,UDP 数据包可能并且将会因任何原因丢失,在任何情况下都无法保证 UDP 数据包被传送。如果您打算使用 UDP,那么您将不得不忍受或找到某种机制来恢复。
我正在使用 UDP 实现客户端-服务器模型。客户端向服务器端发送数据,服务器端除了接收数据外,还需要进行解析。现在,如果我在收到数据后不解析数据,服务器会将 100% 的数据写入文件。但是在解析它时,它会延迟并且一些数据不会写入输出文件。
服务器代码:
while True:
data, addr = s.recvfrom(1024)
#I used pickle since the data is an array
csv_writer.writerow(pickle.loads(data))
#Stating to parse the data now:
arr = pickle.loads(data) <---- The data I need to parse is an array
# If the key exists in the dictionary,
# increment the value by one
currentMessageID = arr[0]
if (dictOfMessageID.has_key(currentMessageID)):
dictOfMessageID[currentMessageID] += 1
# # If the key doesn't exists in dictionary
# # add the key-value pair
else:
dictOfMessageID[currentMessageID] = 1
我该如何解决这个问题?服务器仍然需要写入所有数据并解析它 还是我遗漏了什么,在这种情况下 UDP 数据包会丢失?
我要尝试的第一件事是增加您的 UDP 套接字的传入数据缓冲区(例如通过 sock.setsockopt(socket.SOL_SOCKET, socket.SO_RCVBUF, 128*1024)
),以减少在您解析数据时它溢出的可能性。
如果这还不够,通过更多的工作,您可以通过将接收到的数据包添加到 list/Queue(而不是立即解析它们)并稍后解析它们来分离数据的接收和解析(在接收到所有数据包之后)或在单独的(低优先级)线程中,以便接收传入的数据包不会延迟。
如果这仍然不能给您足够的可靠性,那么您可能需要重新设计您的系统以使用 TCP 流而不是 UDP 数据包,因为 TCP 流会自动降低传输速度以匹配接收程序的速度, 并将根据需要自动重新发送数据包 if/when 它们会因任何原因被丢弃。
请注意,UDP 数据包可能并且将会因任何原因丢失,在任何情况下都无法保证 UDP 数据包被传送。如果您打算使用 UDP,那么您将不得不忍受或找到某种机制来恢复。