【问题标题】:Socket issues in PythonPython 中的套接字问题
【发布时间】:2016-03-04 07:08:27
【问题描述】:

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

这是我客户端的代码:

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)”正确打印。

这是与此相关的服务器代码

for sublist in user_list:
    client_socket.send("NP")
    client_socket.send(sublist[1] + " ")

其中 user_list 是一个嵌套列表,而 sublist[1] 是我希望在客户端打印出来的用户名。

这里发生了什么?

【问题讨论】:

  • 您的套接字是如何设置的?您使用的是 UDP 还是 TCP?
  • @BrianCain TCP - socket.socket(socket.AF_INET,socket.SOCK_STREAM)

标签: python sockets server


【解决方案1】:

您的问题的本质是 TCP 是一种流协议。 recv(bufsize) 中的 bufsize 是最大大小。 recv 函数将始终在可用时返回数据,即使没有收到所有字节。
详情请见documentation

当您只发送了一半字节但您已经开始处理数据时,这会导致问题。我建议你看看this site 中的“recvall”概念,或者你也可以考虑使用 UDP 套接字(这可以解决这个问题,但可能会产生许多其他问题,因为 UDP 不是一个有保证的协议)。

您可能还想让 python 包为您处理一些底层框架。考虑使用here 中记录的 SocketServer:

【讨论】:

  • 在我的情况下,我只发送小字符串,所以缓冲区大小太大还是我遗漏了什么?如果它太大,它会抓取其他数据发送吗?顺便说一句,感谢您的回答,非常有帮助!
  • 指定的缓冲区大小是要接收的最大数据量。它在 python 编程中不太有用,因为 python 框架为你管理所有的内存管理。如果您使用 C 编程语言进行编程,则需要分配一个接收缓冲区,并且接收参数用于告诉 Socket 接口您的缓冲区有多大。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-07-28
  • 2023-03-22
  • 2011-07-09
  • 1970-01-01
  • 2020-02-04
相关资源
最近更新 更多