我正在尝试使用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条件。服务器一直在等待接收更多数据。如果我注释掉两个代码示例中的最后一行,它会按预期工作。为什么会发生这种情况,解决方法是什么?
提前致谢!
答案 0 :(得分:2)
为什么会发生这种情况
您在评论中正确回答了这个问题。
这是什么解决方法?
只是不要编程无限循环。您明智地将数据长度从客户端发送到服务器,因此服务器知道要等待多少字节。在UNIX系统上,处理整个while 1:
循环以及s = ''.join(string_buffer)
并且只写
s = connection.recv(result_size[0], socket.MSG_WAITALL)
代替。在Windows系统上(没有MSG_WAITALL),您仍然需要循环,但只能在收到整个result_size[0]
字节之前。