我正在制作一个客户端 - 服务器应用程序,当服务器等待来自客户端的数据时,我遇到了一些麻烦。
在我的客户端连接到服务器套接字后,服务器打开他的新线程并从客户端获取数据(采用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
答案 0 :(得分:0)
如果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并逐行阅读您的消息(假设您的消息由换行符分隔)。