socketserver

Python socketserver 模块教程

socketserver 模块提供了一组简单易用的类,用于编写网络服务器。它封装了底层的 socket API,使得开发 TCP、UDP 服务器变得更加容易。通过使用 socketserver 模块,开发者可以专注于处理客户端请求,而不必关心底层的网络通信细节。

官方文档链接

Python socketserver官方文档

基本功能

  1. TCP 服务器

以下是一个简单的 TCP 服务器示例,该服务器接受客户端连接并回显客户端发送的数据:

import socketserver

class MyTCPHandler(socketserver.BaseRequestHandler):
    def handle(self):
        self.data = self.request.recv(1024).strip()
        print(f"{self.client_address[0]} wrote:")
        print(self.data)
        self.request.sendall(self.data)

if __name__ == "__main__":
    HOST, PORT = "localhost", 9999
    with socketserver.TCPServer((HOST, PORT), MyTCPHandler) as server:
        print("Server started at {}:{}".format(HOST, PORT))
        server.serve_forever()
  1. UDP 服务器

以下是一个简单的 UDP 服务器示例,该服务器接受客户端数据并回显:

import socketserver

class MyUDPHandler(socketserver.BaseRequestHandler):
    def handle(self):
        data = self.request[0].strip()
        socket = self.request[1]
        print(f"{self.client_address[0]} wrote:")
        print(data)
        socket.sendto(data, self.client_address)

if __name__ == "__main__":
    HOST, PORT = "localhost", 9999
    with socketserver.UDPServer((HOST, PORT), MyUDPHandler) as server:
        print("Server started at {}:{}".format(HOST, PORT))
        server.serve_forever()

高级功能

  1. 多线程服务器

为了处理多个客户端连接,可以使用 ThreadingMixIn 来创建多线程服务器:

import socketserver
import threading

class MyTCPHandler(socketserver.BaseRequestHandler):
    def handle(self):
        self.data = self.request.recv(1024).strip()
        print(f"{self.client_address[0]} wrote:")
        print(self.data)
        self.request.sendall(self.data)

class ThreadedTCPServer(socketserver.ThreadingMixIn, socketserver.TCPServer):
    pass

if __name__ == "__main__":
    HOST, PORT = "localhost", 9999
    with ThreadedTCPServer((HOST, PORT), MyTCPHandler) as server:
        ip, port = server.server_address
        print("Server started at {}:{}".format(ip, port))
        server.serve_forever()
  1. 多进程服务器

为了处理多个客户端连接,可以使用 ForkingMixIn 来创建多进程服务器:

import socketserver
import os

class MyTCPHandler(socketserver.BaseRequestHandler):
    def handle(self):
        self.data = self.request.recv(1024).strip()
        print(f"{self.client_address[0]} wrote:")
        print(self.data)
        self.request.sendall(self.data)

class ForkingTCPServer(socketserver.ForkingMixIn, socketserver.TCPServer):
    pass

if __name__ == "__main__":
    HOST, PORT = "localhost", 9999
    with ForkingTCPServer((HOST, PORT), MyTCPHandler) as server:
        print("Server started at {}:{}".format(HOST, PORT))
        server.serve_forever()
  1. 覆盖默认行为

可以覆盖 socketserver 的一些默认行为,例如,设置请求超时或处理服务器关闭逻辑:

import socketserver

class MyTCPHandler(socketserver.BaseRequestHandler):
    def handle(self):
        self.data = self.request.recv(1024).strip()
        print(f"{self.client_address[0]} wrote:")
        print(self.data)
        self.request.sendall(self.data)

class MyTCPServer(socketserver.TCPServer):
    def server_activate(self):
        self.timeout = 5
        super().server_activate()
        print("Server activated with timeout:", self.timeout)

    def server_close(self):
        super().server_close()
        print("Server closed")

if __name__ == "__main__":
    HOST, PORT = "localhost", 9999
    with MyTCPServer((HOST, PORT), MyTCPHandler) as server:
        print("Server started at {}:{}".format(HOST, PORT))
        server.serve_forever()

使用示例

以下是一个完整的示例,展示了如何使用 socketserver 模块创建一个简单的回显服务器:

  1. TCP 服务器
import socketserver

class MyTCPHandler(socketserver.BaseRequestHandler):
    def handle(self):
        self.data = self.request.recv(1024).strip()
        print(f"{self.client_address[0]} wrote:")
        print(self.data)
        self.request.sendall(self.data)

if __name__ == "__main__":
    HOST, PORT = "localhost", 9999
    with socketserver.TCPServer((HOST, PORT), MyTCPHandler) as server:
        print("Server started at {}:{}".format(HOST, PORT))
        server.serve_forever()
  1. UDP 服务器
import socketserver

class MyUDPHandler(socketserver.BaseRequestHandler):
    def handle(self):
        data = self.request[0].strip()
        socket = self.request[1]
        print(f"{self.client_address[0]} wrote:")
        print(data)
        socket.sendto(data, self.client_address)

if __name__ == "__main__":
    HOST, PORT = "localhost", 9999
    with socketserver.UDPServer((HOST, PORT), MyUDPHandler) as server:
        print("Server started at {}:{}".format(HOST, PORT))
        server.serve_forever()
  1. 客户端
import socket

def tcp_client():
    HOST, PORT = "localhost", 9999
    with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as sock:
        sock.connect((HOST, PORT))
        sock.sendall(b"Hello, World!")
        response = sock.recv(1024)
        print(f"Received: {response}")

def udp_client():
    HOST, PORT = "localhost", 9999
    with socket.socket(socket.AF_INET, socket.SOCK_DGRAM) as sock:
        sock.sendto(b"Hello, World!", (HOST, PORT))
        response, _ = sock.recvfrom(1024)
        print(f"Received: {response}")

if __name__ == "__main__":
    tcp_client()
    udp_client()

总结

socketserver 模块提供了一组方便的类,用于快速编写网络服务器。通过使用这些类,开发者可以专注于处理客户端请求,而不必关心底层的网络通信细节。通过本文介绍的基本功能和高级功能,开发者可以轻松上手并熟练运用 socketserver 进行各种网络编程任务。更多详细信息和示例请参考官方文档

相关推荐

  1. socketserver

    2024-07-10 18:14:06       27 阅读
  2. socketserver和WSGI服务端实现教程

    2024-07-10 18:14:06       28 阅读
  3. 使用python的socketserver使服务器支持多客户端访问

    2024-07-10 18:14:06       57 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-07-10 18:14:06       99 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-07-10 18:14:06       107 阅读
  3. 在Django里面运行非项目文件

    2024-07-10 18:14:06       90 阅读
  4. Python语言-面向对象

    2024-07-10 18:14:06       98 阅读

热门阅读

  1. 广州网络机房搬迁改造方案公司

    2024-07-10 18:14:06       30 阅读
  2. 什么是voc数据,和coco数据的区别是什么?

    2024-07-10 18:14:06       29 阅读
  3. Spring Boot 创建定时任务

    2024-07-10 18:14:06       32 阅读
  4. Redis

    2024-07-10 18:14:06       24 阅读
  5. C语言2D游戏

    2024-07-10 18:14:06       25 阅读
  6. Docker 容器出现 IP 冲突

    2024-07-10 18:14:06       25 阅读
  7. 构建安全稳定的应用:SpringSecurity实用指南

    2024-07-10 18:14:06       26 阅读
  8. 事务的范围比锁的范围大

    2024-07-10 18:14:06       26 阅读
  9. 深度解析:如何利用Python高效挖掘SQLite潜力

    2024-07-10 18:14:06       26 阅读