我遇到了Python套接字模块的问题,我无法在其他任何地方找到它。
我正在构建一个简单的TCP聊天客户端,并且当它最初成功连接到服务器时,尽管我明确设置了超时长度,但脚本在sock.recv()
上无休止地挂起。
我尝试过使用不同的超时值并包含setblocking(False)
,但无论我做什么,它都会像套接字一样处于阻塞模式。
以下是我的代码的相关部分:
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
sock.settimeout(1)
def listen_to_server():
global connected
while connected:
ready_to_read, ready_to_write, in_error = select.select([sock], [], [])
if ready_to_read:
try:
data = sock.recv(1024)
except socket.timeout:
print('TIMEOUT')
if not data:
append_to_log('Disconnected from server.\n')
connected = False
else:
append_to_log(str(data))
任何建议都会有所帮助,我在这里完全失去了。
答案 0 :(得分:2)
您混合了socket timeout
和select
两件事。
当你设置socket timeout
然后你告诉那个套接字:如果我尝试做一些操作(例如recv()
)并且它不会被完成直到我的限制然后提高超时异常。
select
接受文件描述符(仅在Windows上的套接字)并开始检查rlist
(第一个参数)是否包含任何准备好读取的套接字(也就是某些数据已到达)。如果有任何数据到达,则程序继续。
现在你的代码执行此操作:
就是这样。你坚持选择。
您应该在没有选择的情况下致电recv()
。应该应用你的超时。
如果您需要一次管理多个套接字,则必须使用select
并设置第4个参数超时。