python使用SocketServer实现网络服务器

原创:志学Python http://985.so/bVgX
SocketServer简化了网络服务器的编写 。在进行socket创建时 , 使用SocketServer会大大减少创建的步骤 , 并且SocketServer使用了select它有4个类:TCPServer , UDPServer , UnixStreamServer , UnixDatagramServer 。这4个类是同步进行处理的 , 另外通过ForkingMixIn和ThreadingMixIn类来支持异步 。
python使用SocketServer实现网络服务器

文章插图
 
使用SocketServer的步骤简介
创建服务器的步骤 。首先 , 你必须创建一个请求处理类 , 它是BaseRequestHandler的子类并重载其handle()方法 。
实例化一个服务器类 , 传入服务器的地址和请求处理程序类 。
最后 , 调用handlerequest()(一般是调用其他事件循环或者使用select())或serveforever() 。
集成ThreadingMixIn类时需要处理异常关闭 。daemon_threads指示服务器是否要等待线程终止 , 要是线程互相独立 , 必须要设置为True , 默认是False 。
无论用什么网络协议 , 服务器类有相同的外部方法和属性 。
测试案例
服务器端为一个时间戳服务器 , 在接收到客户端发来的数据后 , 自动回复 。
客户端 , 等待用户输入 , 回车后向服务器发送用户输入的内容 。
分别在python2.7和python3.6下测试 。在启动时需要先启动服务器端 , 在启动客户端 。
python2.7下
服务器端代码为
#coding:utf-8import SocketServerfrom time import ctimeprint("=====================SocketServer TCP服务器=====================");HOST = '' #主机号为空白表示可以使用任何可用的地址 。PORT = 21567 #端口号ADDR = (HOST, PORT)class MyRequestHandler(SocketServer.StreamRequestHandler): #StreamRequestHandler实现TCP/UDP服务器的服务处理器 def handle(self): #重写接收响应函数 print('...connect from:', self.client_address) data = https://www.isolves.com/it/cxkf/yy/Python/2019-09-19/self.rfile.readline().strip() print(data) self.wfile.write('[%s] %s' % (ctime(), data))tcpSerSock = SocketServer.TCPServer(ADDR, MyRequestHandler)print('等待连接...')tcpSerSock.serve_forever()客户端代码为
#coding:utf-8from socket import *print("=====================SocketServer TCP客户端=====================");HOST = '127.0.0.1' #本机测试PORT = 21567BUFSIZ = 1024ADDR = (HOST, PORT)while True: tcpCliSock = socket(AF_INET, SOCK_STREAM) #创建客户端套接字 tcpCliSock.connect(ADDR) #发起TCP连接 data = raw_input('> ') #接收用户输入 if not data: #如果用户输入为空 , 直接回车就会发送"" , ""就是代表false break tcpCliSock.send(data+'n') #客户端发送消息 , 必须发送字节数组 data = tcpCliSock.recv(BUFSIZ) #接收回应消息 , 接收到的是字节数组 if not data: #如果接收服务器信息失败 , 或响应消息为空 break print(data) #打印回应消息 tcpCliSock.close() #关闭客户端socketpython3.6下
SocketServer模块在python3中已经更名为socketserver 。
服务器端代码为
#coding:utf-8import socketserverfrom time import ctimeprint("=====================SocketServer TCP服务器=====================");HOST = '' #主机号为空白表示可以使用任何可用的地址 。PORT = 21567 #端口号ADDR = (HOST, PORT)class MyRequestHandler(socketserver.StreamRequestHandler): #StreamRequestHandler实现TCP/UDP服务器的服务处理器 def handle(self): #重写接收响应函数 print('连接到:', self.client_address) data = https://www.isolves.com/it/cxkf/yy/Python/2019-09-19/self.rfile.readline().strip() print(data) self.wfile.write(bytes('[%s] %s' % (ctime(), data.decode('utf-8')),'utf-8'))tcpSerSock = socketserver.TCPServer(ADDR, MyRequestHandler)print('等待连接...')tcpSerSock.serve_forever()客户端代码为
#coding:utf-8from socket import *print("=====================SocketServer TCP客户端=====================");HOST = '127.0.0.1' #本机测试PORT = 21567BUFSIZ = 1024ADDR = (HOST, PORT)while True: tcpCliSock = socket(AF_INET, SOCK_STREAM) #创建客户端套接字 tcpCliSock.connect(ADDR) #发起TCP连接 data = input('> ') #接收用户输入 if not data: #如果用户输入为空 , 直接回车就会发送"" , ""就是代表false break tcpCliSock.send(bytes(data+'n','utf-8')) #客户端发送消息 , 必须发送字节数组 buffer = tcpCliSock.recv(BUFSIZ) #接收回应消息 , 接收到的是字节数组 if not buffer: #如果接收服务器信息失败 , 或响应消息为空 break print(str(buffer,'utf-8')) #打印回应消息 tcpCliSock.close() #关闭客户端socket


推荐阅读