当客户端需要数据时,Python套接字在socket.recv()上保持阻塞状态

时间:2015-06-11 06:50:25

标签: python sockets network-programming client-server

我正在尝试使用Python进行套接字编程并遇到问题。 “服务器”端的代码是:

(connection, address) = in_socket.accept()

size_str =  connection.recv(4)
result_size=struct.unpack('>i',size_str)
string_buffer=[]
print 'results size is: ',result_size[0]
while 1:
    r = connection.recv(result_size[0])
    print 'length is: ', len(r)
    if not r:
        break

    string_buffer.append(r)
s = ''.join(string_buffer)
print 'recieved data: ', s     
connection.send('Thanks for connecting')

对于客户端来说,它是:

sock.connect(server_address)
message = ('{\"message\":\"This is the messcxvage\"}')
packedlen=struct.pack('>i',len(message))
sock.send(packedlen)
sock.send(message)
xyz = sock.recv(1024)

当客户端期待数据返回时,永远不会满足用于中断服务器中的while循环的if条件。服务器一直在等待接收更多数据。如果我注释掉两个代码示例中的最后一行,它会按预期工作。为什么会发生这种情况,解决方法是什么?

提前致谢!

1 个答案:

答案 0 :(得分:2)

  

为什么会发生这种情况

您在评论中正确回答了这个问题。

  

这是什么解决方法?

只是不要编程无限循环。您明智地将数据长度从客户端发送到服务器,因此服务器知道要等待多少字节。在UNIX系统上,处理整个while 1:循环以及s = ''.join(string_buffer)并且只写

s = connection.recv(result_size[0], socket.MSG_WAITALL)

代替。在Windows系统上(没有MSG_WAITALL),您仍然需要循环,但只能在收到整个result_size[0]字节之前。