Python TCP编程
Python TCP programming
我有一个 tcp 服务器和一个用 python 编写的客户端。这些程序的目的是服务器将一个接一个地发送一些数字给客户端,客户端应该在一个单独的线程中处理每个数字。
服务器遍历号码列表并将它们中的每一个发送给客户端。
如:
for num in nums:
client_sock.send(str(num))
客户端循环为:
while True:
data = tcpClientSock.recv(BUFSIZE)
thread.start_new_thread( startFunction, (data, ) )
问题是即使服务器在单独的 send() 调用中发送程序,客户端也会一次接收所有程序。
如何避免?在这种情况下我应该使用 UDP 而不是 TCP 吗?
你必须刷新发送端的套接字 - 添加一个 CR/NL 这样做(因为你要发送一个字符串)
TCP 是基于流的协议,而不是基于消息的。这意味着每次服务器调用 send() 时都没有消息边界。实际上,每次调用 send() 时,数据字节只是添加到流中。
在接收端,您将在流的字节到达时接收到它们。由于没有消息边界,您可能会收到消息的一部分或整个消息或整个+下一条消息的一部分。
为了通过 TCP 流发送消息,您的协议需要建立消息边界。这允许接收方解释它是否收到了部分、完整或多条消息。
在您的示例中,服务器正在发送字符串。字符串终止服务器作为消息边界。在接收方,您应该解析字符串并处理接收部分字符串
我有一个 tcp 服务器和一个用 python 编写的客户端。这些程序的目的是服务器将一个接一个地发送一些数字给客户端,客户端应该在一个单独的线程中处理每个数字。 服务器遍历号码列表并将它们中的每一个发送给客户端。 如:
for num in nums:
client_sock.send(str(num))
客户端循环为:
while True:
data = tcpClientSock.recv(BUFSIZE)
thread.start_new_thread( startFunction, (data, ) )
问题是即使服务器在单独的 send() 调用中发送程序,客户端也会一次接收所有程序。
如何避免?在这种情况下我应该使用 UDP 而不是 TCP 吗?
你必须刷新发送端的套接字 - 添加一个 CR/NL 这样做(因为你要发送一个字符串)
TCP 是基于流的协议,而不是基于消息的。这意味着每次服务器调用 send() 时都没有消息边界。实际上,每次调用 send() 时,数据字节只是添加到流中。
在接收端,您将在流的字节到达时接收到它们。由于没有消息边界,您可能会收到消息的一部分或整个消息或整个+下一条消息的一部分。
为了通过 TCP 流发送消息,您的协议需要建立消息边界。这允许接收方解释它是否收到了部分、完整或多条消息。
在您的示例中,服务器正在发送字符串。字符串终止服务器作为消息边界。在接收方,您应该解析字符串并处理接收部分字符串