080. 编写一个函数,实现简单的的网络服务器功能

在 Python 中,可以使用 socket 模块来实现一个简单的网络服务器。以下是一个示例代码,展示如何创建一个简单的 TCP 服务器,该服务器可以接收客户端的连接并处理请求。

示例代码

以下代码实现了一个简单的 TCP 服务器,服务器会接收客户端发送的消息并回复一个简单的响应。

import socket

def simple_tcp_server(host='127.0.0.1', port=65432):
    """
    简单的 TCP 服务器

    :param host: 服务器地址,默认为 localhost
    :param port: 服务器端口,默认为 65432
    """
    with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s:
        s.bind((host, port))
        s.listen()
        print(f"服务器启动,监听地址 {host}:{port}")

        while True:
            conn, addr = s.accept()
            with conn:
                print(f"连接来自 {addr}")
                while True:
                    data = conn.recv(1024)
                    if not data:
                        break
                    print(f"收到消息:{data.decode('utf-8')}")
                    conn.sendall(b"服务器已收到你的消息: " + data)

# 示例用法
if __name__ == "__main__":
    simple_tcp_server()

代码说明

创建套接字

  • 使用 socket.socket(socket.AF_INET, socket.SOCK_STREAM) 创建一个 TCP 套接字。

  • socket.AF_INET 表示使用 IPv4 地址,socket.SOCK_STREAM 表示使用 TCP 协议。

绑定地址和端口:使用 s.bind((host, port)) 将套接字绑定到指定的地址和端口。

监听连接:使用 s.listen() 开始监听连接请求。

接受连接:使用 s.accept() 接受客户端的连接。该方法返回一个元组 (conn, addr),其中 conn 是客户端的套接字对象,addr 是客户端的地址。

接收和发送数据

  • 使用 conn.recv(1024) 接收客户端发送的数据。

  • 使用 conn.sendall() 向客户端发送响应。

关闭连接

  • 使用 conn.close() 关闭客户端连接。

  • 使用 s.close() 关闭服务器套接字。

示例输出

假设运行上述代码,服务器将启动并监听指定的地址和端口。当客户端连接并发送消息时,服务器将打印收到的消息并回复客户端。

注意事项

  1. 多线程或异步处理:如果需要同时处理多个客户端连接,可以使用多线程或异步 I/O。例如,可以使用 threading 模块为每个客户端创建一个线程。
  2. 错误处理:在实际应用中,建议添加异常处理机制,以处理网络错误、客户端断开连接等情况。
  3. 安全性:确保服务器不会处理恶意数据。在处理客户端数据时,进行适当的验证和清理。
  4. 停止服务器:在实际应用中,可以设置一个条件变量或信号处理机制,以便在需要时停止服务器。

扩展功能

多线程服务器

import threading

def handle_client(conn, addr):
    with conn:
        print(f"连接来自 {addr}")
        while True:
            data = conn.recv(1024)
            if not data:
                break
            print(f"收到消息:{data.decode('utf-8')}")
            conn.sendall(b"服务器已收到你的消息: " + data)

def simple_tcp_server_multithread(host='127.0.0.1', port=65432):
    with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s:
        s.bind((host, port))
        s.listen()
        print(f"服务器启动,监听地址 {host}:{port}")

        while True:
            conn, addr = s.accept()
            client_thread = threading.Thread(target=handle_client, args=(conn, addr))
            client_thread.start()

if __name__ == "__main__":
    simple_tcp_server_multithread()

异步服务器:使用 asyncioasyncio.streams 模块实现异步服务器。

视频讲解

BiliBili: 视睿网络-哔哩哔哩视频 (bilibili.com)