select
像本教程一样
使用建议http://docs.python.org/3/howto/sockets.html#non-blocking-sockets
如果一个套接字在输出可读列表中,您可以确定该套接字上的 recv 将返回某些内容。可写列表的想法相同。你将能够发送一些东西。也许不是你想要的,但有总比没有好。(实际上,任何相当健康的套接字都将返回为可写的——这只是意味着出站网络缓冲区空间可用。)
...如果在这些套接字的输入列表中的某个地方已经死了一个令人讨厌的死亡,则选择将失败。
(最后一段在 Python 3 版本中不再存在。)
这是我通常使用的流程
import select
import socket
ip = '127.0.0.1'
port = 80
conn = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
conn.connect((ip, port))
while True:
try:
ready_to_read, ready_to_write, in_error = \
select.select([conn,], [conn,], [], 5)
except select.error:
conn.shutdown(2) # 0 = done receiving, 1 = done sending, 2 = both
conn.close()
# connection error event here, maybe reconnect
print('connection error')
break
if len(ready_to_read) > 0:
recv = conn.recv(2048)
# do stuff with received data
print(f'received: {recv}')
if len(ready_to_write) > 0:
# connection established, send some stuff
conn.send('some stuff')