2013-02-13 28 views
2

你知道为什么这个循环没有中断吗?python:loop with socket.recv()

#!/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)不停止并且它一直在等待。我怎样才能阻止它? 谢谢

+3

客户端不关闭/关闭套接字,也许? – 2013-02-13 13:12:28

+1

你确定它不会简单地挂在'conn.recv(16)'处,因为套接字没有收到任何数据? – sloth 2013-02-13 13:12:35

+0

是的,客户端没有关闭套接字,因为它等待着答案...... – user1576208 2013-02-13 13:17:32

回答

1

一个解决方案是使插座无阻塞。然后,您会收到一个循环,直到收不到更多数据。如果没有收到数据(即request为空),则连接已关闭,否则您有请求。

当你有你的请求时,将它发送到实际的服务器上,并在等待答复时按照上述方法执行。将答复发送给客户。

+0

我应该使用MSG_DONTWAIT使套接字不被阻塞? – user1576208 2013-02-13 18:01:11

+1

@ user1576208或者使用[''socket.setblocking'](http://docs.python.org/2/library/socket.html#socket.socket.setblocking)方法。 – 2013-02-13 19:25:34

+0

客户端可能需要一些时间才能将任何数据发送到套接字,这意味着连接未关闭,但在调用recv()时未收到数据。无论客户端何时终止连接,您都应该确保协议有某种方式通过消息进行检测。 – Gustavo6046 2016-06-09 23:08:45