• 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()
    
    
    抟扶摇而上者九万里
  • 相关阅读:
    FastDFS学习总结(2)--Tracker与Storage配置详解
    FastDFS学习总结(1)--FastDFS安装和部署
    Git学习总结(6)——作为一名程序员这些代码托管工具你都知道吗?
    Git学习总结(6)——作为一名程序员这些代码托管工具你都知道吗?
    ActiveMQ学习总结(8)——消息队列设计精要
    ActiveMQ学习总结(8)——消息队列设计精要
    vnc
    Apache HTTP服务器 2.0版本文档
    SSH登录很慢
    source insight技巧
  • 原文地址:https://www.cnblogs.com/fengting0913/p/13390628.html
Copyright © 2020-2023  润新知