Python Socket 超时设置 errno 10054
概述
在使用Python的Socket进行网络编程时,会经常涉及到超时设置。如果没有正确设置超时,可能会由于网络阻塞等原因导致程序一直等待而无法继续执行,造成程序假死现象。本文将详细讲解如何在Python的Socket编程中正确设置超时。
错误现象
在没有进行超时设置的情况下,如果对方主机在连接时没有启动或者网络通讯出现异常,将会产生许多问题,比如程序卡死等。具体表现为:
Windows平台下的错误码为:errno 10054,即WSAECONNRESET;
Linux平台下的错误码为:errno 32,即EPIPE错误。
修改方法
Python的Socket库提供了settimeout()方法,可以指定连接或数据收发的超时时间,当Socket连接或数据收发操作超出指定的时间范围时,抛出timeout异常。
示例1
代码如下:
import socket
# 创建socket对象
s = socket.socket()
# 设置超时时间
s.settimeout(10)
# 主动连接远程服务器
s.connect(('www.baidu.com', 80))
# 发送请求到服务器
s.sendall(b"GET / HTTP/1.1\r\nHost: www.baidu.com\r\nConnection: close\r\n\r\n")
# 接收服务器响应数据
print(s.recv(1024))
# 关闭socket
s.close()
上述代码中,我们创建了一个socket连接并设置了超时时间为10秒,然后发送HTTP请求到百度服务器,并接收响应数据。执行代码时如果百度服务器正常响应,则可以正常获取服务器返回的响应数据;而如果超时时间内一直没有收到响应数据,则会抛出timeout异常。
示例2
代码如下:
import socket
# 创建socket对象
s = socket.socket()
# 设置超时时间
s.settimeout(10)
# 监听端口
s.bind(('localhost', 9999))
s.listen()
# 等待客户端连接
try:
while True:
conn, addr = s.accept()
print('已连接:', addr)
# 接收客户端数据
with conn:
while True:
data = conn.recv(1024)
if not data:
break
print('接收到的数据为:', data.decode())
# 发送响应数据
conn.sendall(b'Hello from server!')
except socket.timeout as err:
print(err)
# 关闭socket
s.close()
上述代码中,我们创建了一个socket服务器并设置了超时时间为10秒,然后等待客户端连接,并接收客户端发送的消息并进行响应。执行代码时如果超时时间内没有连接到客户端,则会抛出timeout异常。
结语
以上就是Python Socket超时设置的攻略,通过调整超时时间,我们可以根据实际业务需求来确保Socket的连接或数据的传输不会因为网络等原因而出现异常,从而保证程序的稳定性。