python: 使用socket.recv()的循环

5 投票
2 回答
18703 浏览
提问于 2025-04-17 15:44

你知道为什么这个循环不停止吗?

#!/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 时)就是不停止,一直在等待。我该怎么才能让它停止呢?谢谢!

2 个回答

1

你可以试着设置一个超时时间,具体可以参考这个链接:Python socket在循环中接收数据不停止

3

一种解决办法是把这个“插座”(socket)设置成非阻塞模式。这样的话,你就可以在一个循环里不断接收数据,直到没有更多的数据为止。如果没有收到任何数据(也就是说request是空的),那就说明连接已经关闭了;如果有数据,那你就得到了请求。

当你得到了请求后,就把它发送到真正的服务器上,然后在等待回复的时候也用同样的方法。最后,把回复发送给客户端。

撰写回答