📜  python 版本的 settimout - Python (1)

📅  最后修改于: 2023-12-03 15:34:12.949000             🧑  作者: Mango

Python 版本的 settimeout

在 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 对象。下面是一些示例:

ssl.SSLSocket
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 异常并退出循环。

socketserver.BaseServer
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 异常并退出处理。