python代码模拟服务器实验2:IO多路复用select

实验代码的环境是在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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

forgetable tree

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值