import select
import socket
# 创建一个非阻塞的套接字
server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
server_socket.setblocking(0)
# 绑定端口
server_socket.bind(('localhost', 12345))
server_socket.listen(5)
# 初始化输入列表,包含服务器套接字
inputs = [server_socket]
while True:
# 使用select监控套接字活动
readable, writable, exceptional = select.select(inputs, [], inputs)
for s in readable:
if s is server_socket:
# 如果是服务器套接字,表示有新的连接请求
client_socket, addr = s.accept()
print(f"新连接来自 {addr}")
client_socket.setblocking(0)
inputs.append(client_socket)
else:
# 如果是客户端套接字,表示有数据可读
data = s.recv(1024)
if data:
print(f"收到数据: {data.decode()}")
s.send(data) # 回显数据
else:
# 没有数据表示连接关闭
print("连接关闭")
inputs.remove(s)
s.close()
for s in exceptional:
# 处理异常情况
print("异常情况发生")
inputs.remove(s)
s.close()
select.select():用于监控多个套接字的状态。它接受三个列表作为参数,分别表示需要监控的可读、可写和异常状态的套接字。setblocking(0) 设置套接字为非阻塞模式,这样在调用 accept() 或 recv() 时不会阻塞程序。select.select() 返回的可读套接字中包含服务器套接字时,表示有新的连接请求,使用 accept() 接受连接并将新连接加入到监控列表中。select.select() 返回的可读套接字中包含客户端套接字时,表示有数据可读,使用 recv() 读取数据并回显给客户端。select.select() 返回的异常列表中有套接字时,表示发生了异常,关闭该套接字并从监控列表中移除。这个示例代码展示了如何使用 select 模块来实现一个多路复用的网络服务器,能够同时处理多个客户端连接而不会阻塞。
上一篇:python的运算符
Laravel PHP 深圳智简公司。版权所有©2023-2043 LaravelPHP 粤ICP备2021048745号-3
Laravel 中文站