欢迎访问宙启技术站
智能推送

使用Python的Selector()实现简单的网络服务器的示例

发布时间:2023-12-27 11:22:44

Python中的selector模块提供了基于事件驱动的网络编程接口,可以轻松实现简单的网络服务器。Selector是一个非阻塞I/O事件的反应堆模式,使用了高效的事件轮询机制。

下面是一个使用Selector实现简单网络服务器的示例:

import socket
import selectors
import types

# 创建Selector
sel = selectors.DefaultSelector()

# 定义服务器地址和端口号
HOST = '127.0.0.1'
PORT = 12345

def accept(sock, mask):
    # 接受连接请求
    conn, addr = sock.accept()
    print('Accepted connection from', addr)

    # 设置连接为非阻塞模式
    conn.setblocking(False)

    # 注册读事件
    sel.register(conn, selectors.EVENT_READ, read)

def read(conn, mask):
    # 读取客户端发送的数据
    data = conn.recv(1024)
    if data:
        print('Received', repr(data), 'from', conn.getpeername())

        # 将消息返回给客户端
        conn.send(data)
    else:
        print('Closing connection to', conn.getpeername())
        # 关闭连接
        sel.unregister(conn)
        conn.close()

# 创建套接字并绑定地址和端口
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
sock.bind((HOST, PORT))
sock.listen(100)

# 设置套接字为非阻塞模式
sock.setblocking(False)

# 注册读事件
sel.register(sock, selectors.EVENT_READ, accept)

while True:
    # 调用select方法,监视并等待数据的到达
    events = sel.select()
    for key, mask in events:
        # 调用回调函数处理事件
        callback = key.data
        callback(key.fileobj, mask)

上述示例中,我们首先创建了一个Selector对象,并通过调用register()方法注册要监视的事件。然后,我们创建一个套接字并绑定地址和端口,设置为非阻塞模式,并注册读事件,当有连接请求到达时,会调用accept()函数进行处理。accept()函数会接受连接请求并注册读事件用于读取客户端发送的数据。read()函数负责读取数据、处理数据,并将数据返回给客户端。最后,通过调用select()方法监视等待事件的到达,并通过对应的回调函数处理事件。

以上就是一个使用Python的Selector实现简单网络服务器的示例。您可以根据自己的需求进行修改和扩展。