首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Python编程

Python编程
EN

Stack Overflow用户
提问于 2015-04-30 18:10:12
回答 2查看 127关注 0票数 1

我有一个tcp服务器和一个用python编写的客户机。程序的目的是服务器将一个地发送给客户端,客户端应该在一个单独的线程中处理每个号码。服务器循环遍历数字列表,并将每个数字列表发送给客户端。作为:

代码语言:javascript
复制
for num in nums:
    client_sock.send(str(num))

客户端循环如下:

代码语言:javascript
复制
while True:
    data = tcpClientSock.recv(BUFSIZE)
    thread.start_new_thread( startFunction, (data, ) )

问题是,即使服务器以单独的send()方式发送程序,客户端也同时接收到它。

我怎么才能避免呢?在这种情况下,我应该使用UDP而不是TCP吗?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-04-30 18:13:42

您必须刷新发送端的套接字-添加CR/NL才能这样做(因为您要发送一个字符串)。

票数 2
EN

Stack Overflow用户

发布于 2015-04-30 21:41:39

TCP是基于流的协议,而不是基于消息的协议。这意味着每次服务器调用send()时都没有消息边界。实际上,每次调用send()时,数据的字节就会被添加到流中。

在接收端,您将在流到达时接收它们的字节。由于没有消息边界,所以您可能会收到部分消息或整个消息或下一条消息的整体+部分。

为了通过TCP流发送消息,您的协议需要建立消息边界。这允许接收方解释它是否收到了部分消息、完整消息或多条消息。

在您的示例中,服务器正在发送字符串。字符串终止服务器作为消息边界。在接收端,您应该解析出字符串,并对接收部分字符串进行处理。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/29974830

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档