📅  最后修改于: 2023-12-03 15:28:53.088000             🧑  作者: Mango
在 Python 编程中,套接字(socket)是一种常见的用于网络通信的工具。默认情况下,套接字会阻塞当前线程的执行,直至网络请求完成。但是,在某些情况下,我们希望套接字在等待请求完成时不会阻塞主线程,这时就要使用非阻塞套接字。
非阻塞套接字在等待请求完成时不会阻塞主线程,而是会立即返回一个错误代码(如 EWOULDBLOCK 或 EAGAIN)。这样,主线程可以利用这段时间执行其他任务,待请求完成后再特别处理。这种机制同样适用于异步(Asynchronous)编程模型。
非阻塞套接字适合于以下场景:
以下是在 Python 中实现非阻塞套接字的示例代码:
import socket
server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
server_socket.setblocking(False)
HOST = '' # 使用任意可用的地址
PORT = 8080
BUFFER_SIZE = 1024
server_socket.bind((HOST, PORT))
server_socket.listen(5)
print('等待客户端连接')
while True:
try:
conn, addr = server_socket.accept()
print('连接成功:', addr)
conn.setblocking(False)
data = conn.recv(BUFFER_SIZE)
if data:
print(f'接收到来自客户端的消息:{data}')
conn.sendall(b'Server Response')
except socket.error as e:
print(e)
在上述代码中,我们首先创建一个套接字对象 server_socket
,并将其设置为非阻塞模式。然后,使用 bind
方法绑定一个地址和端口,并使用 listen
方法开始监听客户端连接请求。
接下来,我们使用一个循环不断地接受客户端连接,并将新连接对象 conn
设置为非阻塞模式。然后,我们尝试接收客户端发送的数据,如果有数据则输出到控制台,并向客户端发送一个简单的响应消息。
需要注意的是,在非阻塞模式下,accept
和 recv
方法会抛出 socket.error
异常。因此我们使用了 try...except
语句来捕获异常并打印异常信息。
使用非阻塞套接字能够提高 Python 编程的效率和响应速度,并且更加灵活。注意,在使用非阻塞套接字时需要特别处理异常情况。