使用ThreadingMixIn实现多线程套接字服务器--《Python网络编程攻略》

来源:互联网 发布:淘宝为什么比京东便宜 编辑:程序博客网 时间:2024/06/17 15:04

不同于多进程套接字服务器,基于ThreadingMixIn的多线程套接字服务器具有诸多优势:线程间共享应用状态;避免进程间复杂的通信操作,等等。

实现方法

  1. 创建ThreadedTCPServer类,它将继承TCPServer和ThreadingMixIn类。客户端连接这个多线程服务器时,就会创建一个新线程进行处理。
  2. 请求处理类ForkingServerRequestHandler会在一个新线程中将消息回显给客户端,在这个类中可以获取新线程的信息。
  3. 简单起见,客户端代码放在一个函数而不是一个类中。客户端代码创建客户端套接字,然后向服务器发送消息。

代码 2_2_threading_mixin_socket_server.py

'''Created on 2017-2-28@author: lenovo'''import osimport socketimport threadingimport SocketServerSERVER_HOST = 'localhost'SERVER_PORT = 0 # Tells the kernel to pick up a port dynamicallyBUF_SIZE = 1024def client(ip,port,message):    """A Client to test threading mixin server"""    # Connect to the server    sock = socket.socket(socket.AF_INET,socket.SOCK_STREAM)    sock.connect((ip,port))    try:        sock.sendall(message)        response = sock.recv(BUF_SIZE)        print "Client received: %s" %response    finally:        sock.close()class ThreadedTCPRequestHandler(SocketServer.BaseRequestHandler):    def handle(self):        # Send the echo back to the client        data = self.request.recv(BUF_SIZE)        current_thread = threading.current_thread()        response = "%s: %s" %(current_thread.name,data)        self.request.sendall(response)class ThreadedTCPServer(SocketServer.ThreadingMixIn,SocketServer.TCPServer,):    """Nothing to add here, inherited everything necessary form parents."""    """Mix-in class to handle each request in a new thread."""    passif __name__ == '__main__':    #Launch the server    server = ThreadedTCPServer((SERVER_HOST,SERVER_PORT),ThreadedTCPRequestHandler)    ip,port = server.server_address #Retrive the port number    server_thread = threading.Thread(target=server.serve_forever)    server_thread.setDaemon(True)    server_thread.start()    print 'Server loop running on thread: %s' %server_thread.name    #Launch the client    client(ip,port,"Hello from client1")    client(ip,port,"Hello from client2")    client(ip,port,"Hello from client2")    #clean them up    server.shutdown()

运行情况

Server loop running on thread: Thread-1Client received: Thread-2: Hello from client1Client received: Thread-3: Hello from client2Client received: Thread-4: Hello from client2
0 0
原创粉丝点击