📅  最后修改于: 2023-12-03 15:34:12.949000             🧑  作者: Mango
在 Python 中,有许多场景需要设置超时,例如网络请求、文件读写等,这时候就需要使用 settimeout 方法。在 Python 2.x 版本中,settimeout 方法可以应用于 socket 对象,但是在 Python 3.x 版本中,settimeout 方法可以应用于 socket 对象、ssl.SSLSocket 对象、socketserver.BaseServer 对象等。
下面的例子演示了如何使用 settimeout 方法:
import socket
# 创建一个 socket 对象
client_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
# 设置超时时间为 5 秒
client_socket.settimeout(5)
# 连接服务器
client_socket.connect(('www.example.com', 80))
# 发送请求
request = b"GET / HTTP/1.1\r\nHost: www.example.com\r\n\r\n"
client_socket.sendall(request)
# 接收响应
response = b""
while True:
try:
data = client_socket.recv(1024)
response += data
except socket.timeout:
break
# 关闭连接
client_socket.close()
print(response.decode())
在上面的例子中,我们创建了一个 socket 对象,并设置了超时时间为 5 秒。然后,我们连接服务器并发送请求,接收响应。由于我们设置了超时时间为 5 秒,如果服务器在 5 秒内没有响应,我们将捕获 socket.timeout 异常并退出循环。
除了 socket 对象之外,settimeout 方法还可以应用于 ssl.SSLSocket 对象、socketserver.BaseServer 对象。下面是一些示例:
import ssl
import socket
# 创建一个 SSL socket 对象
client_socket = ssl.wrap_socket(socket.socket(socket.AF_INET, socket.SOCK_STREAM))
# 设置超时时间为 5 秒
client_socket.settimeout(5)
# 连接服务器
client_socket.connect(('www.example.com', 443))
# 发送请求
request = b"GET / HTTP/1.1\r\nHost: www.example.com\r\n\r\n"
client_socket.sendall(request)
# 接收响应
response = b""
while True:
try:
data = client_socket.recv(1024)
response += data
except socket.timeout:
break
# 关闭连接
client_socket.close()
print(response.decode())
在上面的例子中,我们创建了一个 SSL socket 对象,并设置了超时时间为 5 秒。然后,我们连接服务器并发送请求,接收响应。如果服务器在 5 秒内没有响应,我们将捕获 socket.timeout 异常并退出循环。
import socketserver
# 自定义处理请求的类
class MyHandler(socketserver.BaseRequestHandler):
def handle(self):
# 设置超时时间为 5 秒
self.request.settimeout(5)
# 接收数据
data = self.request.recv(1024)
# 发送响应
response = b"HTTP/1.1 200 OK\r\nContent-Type: text/plain\r\nContent-Length: 13\r\n\r\nHello, world!"
self.request.sendall(response)
# 创建一个 TCP 服务器对象
server = socketserver.TCPServer(('localhost', 8000), MyHandler)
# 运行服务器
server.serve_forever()
在上面的例子中,我们创建了一个 TCP 服务器对象,并传入一个自定义的处理请求的类 MyHandler。在 MyHandler 类的 handle 方法中,我们设置了超时时间为 5 秒,并接收了客户端发送的数据,发送了响应。如果客户端在 5 秒内没有发送数据,我们将捕获 socket.timeout 异常并退出处理。