python 并发socketserver模块

1.源码class

1.server类:处理链接
        +------------+
        | BaseServer |
        +------------+
              |
              v
        +-----------+        +------------------+
        | TCPServer |------->| UnixStreamServer |
        +-----------+        +------------------+
              |
              v
        +-----------+        +--------------------+
        | UDPServer |------->| UnixDatagramServer |
        +-----------+        +--------------------+

                                1)进程类
                            +------------+
                            | BaseServer |
                            +------------+
                                  |
                                  v
                            +------------+
                            | TCPServer |
                            +------------+
                                  |
                                  v
    +------------+    +------------------+
    | ForkingMixIn|   |       UDPServer |
    +-----------+    +------------------+
             |           |
             v           v          备注此类继承ForkingMixIn和TCPServer
        +------------------+        +--------------------+
        | ForkingUDPServer |       | ForkingTCPServer |
        +----------------+        +--------------------+

                                2)线程类
                            +------------+
                            | BaseServer |
                            +------------+
                                  |
                                  v
                            +------------+
                            | TCPServer |
                            +------------+
                                  |
                                  v
    +-----------+    +------------------+
   | ThreadingMixIn|   |       UDPServer |
    +-----------+    +------------------+
             |           |
             v           v          备注此类继承ThreadingMixIn和ThreadServer
        +------------------+        +--------------------+
        | ThreadingUDPServer |     | ThreadingTCPServer |
        +----------------+        +--------------------+





2.request类: 处理通信
        +-------------------------------------------+
        |                BaseRequestHandler         |
        +------------------------------------------+
              |                          |
              v                          v
        +--------------------+             +----------------------+
        | StreamRequestHandler|            |DatagramRequestHandler|
        +--------------------+            +-----------------------+


'''

2.创建socketserver步骤

创建一个socketserver 至少分以下几步:

    First, you must create a request handler class by subclassing the BaseRequestHandlerclass and overriding its handle() method; this method will process incoming requests.   

    Second, you must instantiate one of the server classes, passing it the server’s address and the request handler class.

    Then call the handle_request() orserve_forever() method of the server object to process one or many requests.

    Finally, call server_close() to close the socket.

3.简单实例

#!/usr/bin/python env
# coding:utf-8


import socketserver

ip_port = ('127.0.0.1', 800)

'''
    def __init__(self, request, client_address, server):
        self.request = request
        self.client_address = client_address
        self.server = server
        self.setup()
        try:
            self.handle()
        finally:
            self.finish()
'''


# tcp服务端并发
class MyServer(socketserver.BaseRequestHandler):
    def handle(self):
        print('conn is: ', self.request)  # conn 链接
        print('addr is: ', self.client_address)  # addr 客户端地址
        conn = self.request
        client_address = self.client_address

        while True:  # 通信循环
            try:  # 处理client端端口 报出的异常
                data = conn.recv(1024)
                if not data: break  # 处理接受数据为空,无限循环
                print('客户端发来的信息是:', data.decode('utf-8'), client_address)
                self.request.sendall(data)
            except Exception as e:
                print(e)
                break


if __name__ == '__main__':
    s = socketserver.ThreadingTCPServer(ip_port, MyServer)  # 多线程 连接循环 通信循环套在连接循环中
    # s = socketserver.Forkingip_port,MyServer) #多进程 连接循环 通信循环套在连接循环中

    s.serve_forever()
    
# 客户端
from socket import *

ip_port = ("127.0.0.1", 800)
back_log = 10
buffer_size = 1024

tcp_client = socket(AF_INET, SOCK_STREAM)
tcp_client.connect(ip_port)

while True:
    msg = input(">>: ")
    if not msg: continue  # 解决输入空数据问题
    tcp_client.send(msg.encode("utf-8"))
    data = tcp_client.recv(back_log)

    print("客户端发来信息:", data.decode("utf-8"))

tcp_client.close()
原文地址:https://www.cnblogs.com/icemonkey/p/10470105.html