select()实现I/O复用并发服务器

本文介绍如何利用Python的select()模块实现一个I/O复用的并发服务器,详细展示了服务端和客户端的代码实现,以实现echo功能。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

用select()模块,基于Python实现了一个简单的echo程序。

服务端程序:

import socket
import select

serv_socket = socket.socket(family=socket.AF_INET, type=socket.SOCK_STREAM)
serv_socket.bind(("127.0.0.1", 4567))
serv_socket.listen(5)
print("服务端开启...")
rlist = [serv_socket]

while True:
    # rlist等待读取的对象,wlist等待写入的对象, xlist等待异常的对象
    rs, ws, es = select.select(rlist, [], [], 3)
    for r in rs:
        # 如果是serv_socket可读,则说明有新的连接请求到来
        if r is serv_socket:
            clnt_socket, clnt_addr = serv_socket.accept()
            print(clnt_addr, "建立连接")
            # 把客户端socket也加入到等待读取对象列表中
            rlist.append(clnt_socket)
        # 客户端socket发送了消息
        else:
            data = r.recv(1024)
            # 如果客户端不发送的不是q,服务器echo接受到的消息给客户端
            if data != b'':
                print("收到客户端发来的消息:%s" % data.decode())
                r.send(data)
            else:
                rlist.remove(r)

客户端程序:

import socket

host = '127.0.0.1'
port = 4567
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.connect((host, port))

while True:
    msg = input("please input a string(q for quit):")
    if msg == 'q' or msg == 'Q':
        break
    s.send(msg.encode())
    rcv_msg = s.recv(1024)
    print("客户端回送消息:%s"%rcv_msg.decode())
s.close()

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值