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,那么您将不得不忍受或找到某种机制来恢复。