用python編寫socket多路複用
时间: 2023-08-04 11:12:01 浏览: 182
详解Python IO口多路复用
可以使用 Python 的 select 模块来实现 socket 多路复用。下面是一个示例代码:
```python
import socket
import select
# 创建 TCP 服务端 Socket
server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
# 设置 Socket 地址重用,防止程序结束后 5 分钟内不能立即再次运行
server_socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
# 绑定 IP 和端口号
server_socket.bind(('0.0.0.0', 8888))
# 设置监听队列大小
server_socket.listen(10)
# 创建一个列表,用于存放所有的 Socket 对象
sockets_list = [server_socket]
print('服务器启动成功!')
while True:
# 使用 select 监听所有的 Socket 对象
rsockets, wsockets, esockets = select.select(sockets_list, [], [])
# 遍历返回的 Socket 列表,分别处理连接请求和已连接 Socket 的数据
for rsocket in rsockets:
# 如果是服务端 Socket,表示有新的客户端连接请求
if rsocket == server_socket:
# 接受客户端连接
client_socket, client_address = server_socket.accept()
# 将新的客户端 Socket 加入到列表中
sockets_list.append(client_socket)
print(f'已连接客户端 {client_address}')
# 如果是已连接 Socket,则表示有数据传输
else:
# 接收客户端数据
data = rsocket.recv(1024)
# 如果没有数据,表示客户端已关闭连接
if not data:
# 关闭客户端 Socket
rsocket.close()
# 从列表中删除客户端 Socket
sockets_list.remove(rsocket)
print(f'已断开客户端 {rsocket.getpeername()}')
# 如果有数据,将数据发送给所有的客户端
else:
# 遍历所有的客户端 Socket,将数据发送给它们
for socket_item in sockets_list:
if socket_item != server_socket and socket_item != rsocket:
socket_item.send(data)
```
这个程序可以监听多个客户端的连接和数据传输,并将接收到的数据发送给所有的客户端。在运行程序之前,需要先启动多个客户端程序来连接服务器。
阅读全文