python:socket.recv()循环

python:socket.recv()循环,python,python-sockets,Python,Python Sockets,你知道为什么这个循环没有中断吗 #!/usr/bin/env python from socket import * import os import sys if __name__ == '__main__': HOST = '127.0.0.1' PORT = 55554 print 'Creating socket' socketProxy = socket(AF_INET, SOCK_STREAM) print 'bind()' socketProxy.setsock

你知道为什么这个循环没有中断吗

#!/usr/bin/env python

from socket import *
import os
import sys

if __name__ == '__main__':
 HOST = '127.0.0.1'
 PORT = 55554

 print 'Creating socket'
 socketProxy = socket(AF_INET, SOCK_STREAM)

 print 'bind()'
 socketProxy.setsockopt(SOL_SOCKET, SO_REUSEADDR, 1)
 socketProxy.bind((HOST, PORT))

 print 'Waiting for connection request'
 socketProxy.listen(1)
 conn, addr = socketProxy.accept()

 print 'Connected to ', addr

 request = ''

 while True:
    data = conn.recv(16);
    if not data: break
    request = request+data


print request
sys.stdout.flush()
我正在编写一个小的服务器代理来获取任意长的请求,所以我必须等到收到所有请求。无论如何,这个循环(当len(data)==0时)没有停止,它一直在等待。我怎样才能阻止它?
谢谢

一个解决方案是使套接字不阻塞。然后在循环中接收,直到不再接收数据。如果未收到任何数据(即,
请求
为空),则连接已关闭,否则您将收到请求


当您收到请求时,将其发送到实际的服务器,并在等待答复时执行上述操作。将答复发送到客户端。

客户端可能不会关闭/关闭套接字?您确定它不会因为套接字未接收任何数据而挂起在
conn.recv(16)
上吗?是的,客户端不会关闭套接字,因为它会等待回答…请记住,默认情况下套接字是阻塞的,因此,如果没有接收到任何内容,那么
recv
将阻塞并等待。我知道…问题是,客户端和服务器是由我们的老师提供的,那么我们必须编写一个代理。当客户端发送请求(类似http的请求)时,它不会关闭套接字…并等待响应。代理必须从服务器获取html页面并将其发送到客户端。因此,要在不阻塞的情况下从客户端获取请求,我是否应该执行recv(n)并决定n是否相当大?我是否应该使用MSG_DONTWAIT使套接字不阻塞?@user1576208或使用该方法。客户端可能需要一些时间将任何数据发送到套接字,这意味着连接没有关闭,但在recv()时没有收到任何数据被称为。当客户端终止连接时,您应该确保协议有某种方式通过消息进行检测。