我正在使用套接字构建一个简单的服务器 - 客户端应用程序。现在,我正在尝试让我的客户端只有在收到特定消息时才会打印到控制台(实际上,当它没有收到特定消息时),但由于某种原因,每隔一次我运行它,它通过我的代码中的另一个语句并且实际上是不一致的 - 有时它会按预期工作,然后它将随机中断几次使用。
以下是我客户端的代码:
def post_checker(client_socket):
response = client_socket.recv(1024)
#check if response is "NP" for a new post from another user
if response == "NP":
new_response = client_socket.recv(1024)
print new_response
else: #print original message being sent
print response
其中post_checker在main函数中被简单地调用为" post_checker(client_socket)"基本上,有时我得到" NPray"打印到我的控制台(当客户端只希望收到用户名" ray")时,它会正确打印。
以下是与此
相关的服务器代码for sublist in user_list:
client_socket.send("NP")
client_socket.send(sublist[1] + " ")
其中user_list是嵌套列表,子列表[1]是我希望在客户端打印出来的用户名。
这是怎么回事?
答案 0 :(得分:3)
您的问题的本质是TCP是一种流媒体协议。 recv(bufsize)中的bufsize是最大大小。即使未收到所有字节,recv函数也会在可用时始终返回数据 有关详细信息,请参阅documentation。
如果您只发送了一半的字节,但是您已经开始处理数据,则会导致问题。我建议你看看" recvall"来自this site的概念,或者您也可以考虑使用UDP套接字(这可以解决此问题但可能会创建其他主机,因为UDP不是保证协议)。
您可能还想让python包为您处理一些底层框架。考虑使用SocketServer,如文档here: