Python使用SocketServer模块编写基本服务器程序的教程
SocketServer简化了网络服务器的编写。它有4个类:TCPServer,UDPServer,UnixStreamServer,UnixDatagramServer。这4个类是同步进行处理的,另外通过ForkingMixIn和ThreadingMixIn类来支持异步。 创建服务器的步骤。首先,你必须创建一个请求处理类,它是BaseRequestHandler的子类并重载其handle()方法。其次,你必须实例化一个服务器类,传入服务器的地址和请求处理程序类。最后,调用handle_request()(一般是调用其他事件循环或者使用select())或serve_forever()。 集成ThreadingMixIn类时需要处理异常关闭。daemon_threads指示服务器是否要等待线程终止,要是线程互相独立,必须要设置为True,默认是False。 无论用什么网络协议,服务器类有相同的外部方法和属性。 在Python3中,本模块为socketserver模块。在Python 2中,本模块为SocketServer模块。所以在用import导入时,要分情况导入,否则会报错。导入的代码如下: try: import socketserver #Python 3 except ImportError: import SocketServer #Python 2 SocketSerror模块包括许多可以简化TCP、UDP、UNIX域套接字 服务器实现的类。 一、处理程序 二、服务器 三、定义自定义服务器 四、实例 #! /usr/bin/env python #coding=utf-8 """使用SocketServer来实现简单的TCP服务器""" from SocketServer import (TCPServer,StreamRequestHandler as SRH) from time import ctime class MyRequestHandler(SRH): def handle(self): print "connected from ",self.client_address self.wfile.write("[%s] %s" %(ctime(),self.rfile.readline())) tcpSer=TCPServer(("",10001),MyRequestHandler) print "waiting for connection" tcpSer.serve_forever() 相应的TCP客户端代码: #! /usr/bin/env python #coding=utf-8 from socket import * BUFSIZE=1024 #每次都要创建新的连接 while True: tcpClient=socket(AF_INET,SOCK_STREAM) tcpClient.connect(("localhost",10001)) data=raw_input(">") if not data: break tcpClient.send("%srn" %data) data1=tcpClient.recv(BUFSIZE) if not data1: break print data1.strip() tcpClient.close() 2.异步服务器的实现 ThreadingMixIn的例子: import socketimport threadingimport SocketServerclass ThreadedTCPRequestHandler(SocketServer.BaseRequestHandler): def handle(self): data = self.request.recv(1024) cur_thread = threading.current_thread() response = "{}: {}".format(cur_thread.name,data) self.request.sendall(response)class ThreadedTCPServer(SocketServer.ThreadingMixIn,SocketServer.TCPServer): passdef client(ip,port,message): sock = socket.socket(socket.AF_INET,socket.SOCK_STREAM) sock.connect((ip,port)) try: sock.sendall(message) response = sock.recv(1024) print "Received: {}".format(response) finally: sock.close()if __name__ == "__main__": # Port 0 means to select an arbitrary unused port HOST,PORT = "localhost",0 server = ThreadedTCPServer((HOST,PORT),ThreadedTCPRequestHandler) ip,port = server.server_address # Start a thread with the server -- that thread will then start one # more thread for each request server_thread = threading.Thread(target=server.serve_forever) # Exit the server thread when the main thread terminates server_thread.daemon = True server_thread.start() print "Server loop running in thread:",server_thread.name client(ip,"Hello World 1") client(ip,"Hello World 2") client(ip,"Hello World 3") server.shutdown() 执行结果: $ python ThreadedTCPServer.py Server loop running in thread: Thread-1 Received: Thread-2: Hello World 1 Received: Thread-3: Hello World 2 Received: Thread-4: Hello World 3 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |