【问题标题】:recv() function not waiting for datarecv() 函数不等待数据
【发布时间】:2016-02-02 13:02:41
【问题描述】:

我正在制作一个客户端-服务器应用程序,但在服务器等待来自客户端的数据时遇到了一些麻烦。

在我的客户端连接到服务器套接字后,服务器打开他的新线程并从客户端获取数据(JSON 格式)。 到目前为止,我的代码适用于一条消息。当我添加while循环时,总是接受消息我遇到了问题。经过一些测试,我发现 recv() 函数没有等待新数据并继续到下一行,这就是造成问题的原因。 如果你能帮我解决问题,我会很高兴。

我的接收数据循环(循环的第一次迭代有效,但在第二次迭代中接收数据不等待数据并产生问题,因为下一行没有得到任何数据)-

    while True:
        data = self.client.recv(self.size) # receive data
        message = self.JSON_parser(data) # parser the data (data in json format)
        process_message = processing.Processing(message[0]['key'],message[0]['user'],message[0]['data']) # send the receive data to the initialize process
        process_return = process_message.action() # call to the action function
        self.client.send(process_return) # send to the client message back

【问题讨论】:

  • recv() 返回后的data 是什么?一个空字符串?
  • 问题是没有数据发送到服务器所以recv()没有得到数据(recv()需要等待但他不等待,什么都没有),为空。
  • 空字符串表示关闭连接。客户端或服务器在第一条消息后关闭套接字
  • 谢谢 我不知道这意味着客户端或服务器正在关闭套接字+1(;

标签: python while-loop server recv


【解决方案1】:

如果recv()返回一个空字符串,则表示连接已经关闭。

套接字可能被客户端或服务器关闭。在这种情况下,查看您发布的服务器代码,我几乎可以确定客户端正在关闭连接,可能是因为它正在退出。

一般来说,您的服务器代码应如下所示:

while True:
    data = self.client.recv(self.size)
    if not data:
        # client closed the connection
        break
    message = self.JSON_parser(data)
    ...

额外提示:较长的 JSON 消息可能需要多次调用 recv()。同样,recv() 可能返回不止一条 JSON 消息。

确保适当地实施缓冲。考虑wrapping your socket into a file-like object 并逐行阅读您的消息(假设您的消息由换行符分隔)。

【讨论】:

    猜你喜欢
    • 2023-03-08
    • 2019-12-12
    • 2023-03-13
    • 2020-09-05
    • 2019-06-16
    • 2018-02-03
    • 2020-06-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多