Laravel  
laravel
文档
数据库
架构
入门
php技术
    
Laravelphp
laravel / php / java / vue / mysql / linux / python / javascript / html / css / c++ / c#

python select

作者:冰残°零度伤   发布日期:2026-05-04   浏览:63

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的运算符

下一篇:windows运行python脚本

大家都在看

python 二维码识别

python excel 库

python时间格式

pythoneval函数用法

列表切片操作python

python读取文件路径

staticmethod在python中有

python 保存json文件

python的assert基本用法

python开发windows应用程序

Laravel PHP 深圳智简公司。版权所有©2023-2043 LaravelPHP 粤ICP备2021048745号-3

Laravel 中文站