• TCP并发服务器


    基于TCP协议编写并发服务器

    基于多进程编写 tcp 并发服务器

    import socket
    import multiprocessing
    
    
    def set_server():
        """
        服务器相关设置
        :return:
        """
        # 1、创建'TCP'协议下的套接字对象
        sk = socket.socket()
    
        # 2、一般来说,一个端口释放后会等待两分钟之后才能再被使用,
        # 'SO_REUSEADDR'是让端口释放后立即就可以被再次使用
        # 'value'设置为 1,表示将'SO_REUSEADDR'标记为'TRUE'
        sk.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
    
        # 3、服务端绑定(ip + port)注册网络
        sk.bind(("127.0.0.1", 6688))
    
        # 4、开启监听
        sk.listen(5)
    
        try:
            while True:
                conn, client_addr = sk.accept()
                p1 = multiprocessing.Process(target=deal_client_request, args=(conn, client_addr))
                p1.start()
                conn.close()
        finally:
            sk.close()
    
    
    def deal_client_request(conn, client_addr):
        """
        处理客户端的请求,为其服务,进行数据收发
        :param conn:
        :param client_addr:
        :return:
        """
        while True:
            recv_msg = conn.recv(1024)
            if len(recv_msg) > 0:
                print(recv_msg.decode())
            else:
                print(f"{client_addr} 客户端已主动关闭!")
                break
        conn.close()
    
    
    if __name__ == "__main__":
        set_server()
    
    

    基于多线程编写 tcp 并发服务器

    # 多线程 tcp 并发服务器
    
    import socket
    import threading
    
    
    def server_set():
        """
        服务器相关设置
        :return:
        """
        sk = socket.socket()
        sk.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
        sk.bind(("127.0.0.1", 6688))
        sk.listen(5)
        try:
            while True:
                conn, client_addr = sk.accept()
                t1 = threading.Thread(target=deal_client_request, args=(conn, client_addr))
                t1.start()
        finally:
            sk.close()
    
    
    def deal_client_request(conn, client_addr):
        """
        处理客户端请求,进行数据收发
        :param conn:
        :param client_addr:
        :return:
        """
        while True:
            recv_msg = conn.recv(1024)
            if len(recv_msg) > 0:
                print(recv_msg.decode())
            else:
                print(f"{client_addr} 客户端已主动关闭连接!")
                break
        conn.close()
    
    
    if __name__ == "__main__":
        server_set()
    
    

    基于 SocketServer 实现简化并发服务器

    import socketserver
    
    
    class MyServer(socketserver.BaseRequestHandler):
        def handle(self):
            while True:
                # 接收数据
                recv_msg = self.request.recv(1024)
                print(recv_msg.decode())
                # 响应数据
                self.request.send(recv_msg)
    
    
    if __name__ == "__main__":
        # 允许端口重用
        socketserver.TCPServer.allow_reuse_address = True
        # 实例化服务器对象
        server = socketserver.ThreadingTCPServer(("127.0.0.1", 6688), MyServer)
        # 服务器永久运行
        server.serve_forever()
    
    
    抟扶摇而上者九万里
  • 相关阅读:
    HDU5195 线段树+拓扑
    Codeforces Round #328 (Div. 2)D. Super M 虚树直径
    HDU5489 LIS变形
    BZOJ 1787: [Ahoi2008]Meet 紧急集合 LCA
    Codeforces Round #330 (Div. 2)B. Pasha and Phone 容斥
    Codeforces Round #330 (Div. 2) D. Max and Bike 二分
    Codeforces Round #277 (Div. 2) E. LIS of Sequence DP
    Codeforces Round #277 (Div. 2) D. Valid Sets DP
    内存对齐
    mui列表跳转到详情页优化方案
  • 原文地址:https://www.cnblogs.com/fengting0913/p/13390628.html
Copyright © 2020-2023  润新知