zoukankan      html  css  js  c++  java
  • 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()
  • 相关阅读:
    Java知识回顾 (8) 集合
    Java知识回顾 (7) 继承、多态与接口、封装
    使用LEANGOO泳道
    使用列表
    LEANGOO用户设置
    创建LEANGOO项目
    为看板添加成员
    创建看板卡片
    创建LEANGOO看板
    创建LEANGOO账号
  • 原文地址:https://www.cnblogs.com/icemonkey/p/10470105.html
Copyright © 2011-2022 走看看