Python中的套接字问题

Python中的套接字问题,python,sockets,server,Python,Sockets,Server,我正在使用套接字构建一个简单的服务器客户端应用程序。现在,我试图让我的客户机仅在收到特定消息时(实际上,当它没有收到特定消息时)才打印到控制台,但出于某种原因,每隔运行一次,它在我的代码中通过了另一条语句,并且非常不一致——有时它会按它应该的方式工作,然后它会随机中断以供两次使用 以下是我客户端的代码: def post_checker(client_socket): response = client_socket.recv(1024) #check if response

我正在使用套接字构建一个简单的服务器客户端应用程序。现在,我试图让我的客户机仅在收到特定消息时(实际上,当它没有收到特定消息时)才打印到控制台,但出于某种原因,每隔运行一次,它在我的代码中通过了另一条语句,并且非常不一致——有时它会按它应该的方式工作,然后它会随机中断以供两次使用

以下是我客户端的代码:

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被简单地称为“post_checker(client_socket)”,基本上,有时我会将“NPray”打印到我的控制台(当客户端只希望收到用户名“ray”时),其他时候它会正确打印

以下是与此相关的服务器代码

for sublist in user_list:
    client_socket.send("NP")
    client_socket.send(sublist[1] + " ")
其中,user_list是一个嵌套列表,sublist[1]是我希望在客户端打印的用户名


这是怎么回事

问题的本质是TCP是一种流协议。recv中的bufsize(bufsize)是最大大小。recv功能在可用时将始终返回数据,即使未收到所有字节。
有关详细信息,请参阅

当您只发送了一半字节,但已经开始处理数据时,就会出现问题。我建议您查看一下“ReVALL”的概念,或者您也可以考虑使用UDP套接字(这将解决这个问题,但可能会创建其他主机,因为UDP不是一个有保证的协议)。
您可能还希望让python包为您处理一些底层框架。考虑使用SockServer作为文档:

您的套接字是如何设置的?您使用的是UDP还是TCP?@BrianCain TCP-socket.socket(socket.AF\u INET,socket.SOCK\u STREAM)在我的情况下,我只发送小字符串,所以缓冲区大小是否太大,或者我是否遗漏了什么?如果它太大,它会抓取其他数据发送吗?谢谢你的回答,顺便说一句,非常有帮助!指定的缓冲区大小是要接收的最大数据量。它在python编程中不太有用,因为python框架为您管理所有内存管理。如果使用C编程语言编程,则需要分配一个接收缓冲区,接收参数用于告诉套接字接口缓冲区有多大。