针对连接(connect)时候的超时:python
# 法一: import socket socket.setdefaulttimeout(5) sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) sock.connect((host, port)) sock.sendall('xxx') sock.recv(1024) sock.close() ''' 20160716 update socket.setdefaulttimeout(5) 此句必须放到创建连接的前面,不然超时设置无效果 '''
# 法二: import socket sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) sock.settimeout(5) sock.connect((host, port)) # 恢复默认超时设置,设置某些状况下socket进入阻塞模式(如makefile) sock.settimeout(None) sock.connect((host, port)) sock.sendall('xxx') sock.recv(1024) sock.close()
针对接收(recv)数据时的超时:socket
# 法一: import socket socket.setdefaulttimeout(5) sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) sock.connect((host, port)) sock.sendall('xxx') # 链接和接收的时候都设置一次超时 sock.settimeout(5) sock.recv(1024) sock.close()
# 法二[未验证]: import select mysocket.setblocking(0) ready = select.select([mysocket], [], [], timeout_in_seconds) if ready[0]: data = mysocket.recv(4096)
参考连接:code
http://stackoverflow.com/questions/2719017/how-to-set-timeout-on-pythons-socket-recv-methodio