实验代码的环境是在windows,和linux是有差别的
在Windows系统上,select模块需要传递特定的对象类型,而不是文件描述符。在Unix-like系统上,文件描述符是一个整数,而在Windows上,select期望得到的是socket对象本身,而不是它们的文件描述符。
import select
import socket
import sys
# 创建一个TCP/IP套接字
server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
server_socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
server_socket.bind(('localhost', 8080)) # 绑定到任意可用端口
server_socket.listen(5) # 开始监听,最多允许5个连接排队
# 设置非阻塞模式
server_socket.setblocking(0)
# 准备socket列表,用于select监听
inputs = [server_socket]
# 无限循环,处理IO
while True:
# 调用select,等待socket就绪
readable, writable, exceptional = select.select(inputs, [], [])
# 遍历就绪的socket
for s in readable:
if s is server_socket:
# 处理新的连接
client_socket, client_address = server_socket.accept()
print('新连接:', client_address)
client_socket.setblocking(0)
inputs.append(client_socket)
else:
# 处理已连接的客户端发送的数据
data = s.recv(1024)
if data:
print('从客户端接收:', data.decode())
else:
# 如果客户端关闭连接,则移除socket
print('客户端断开连接')
inputs.remove(s)
s.close()
# 注意:这个例子仅用于演示目的,并未包含完整的错误处理和资源清理。
客户端代码参考实验1