正如前面的socket模块部分看到的一样,写一个简单套接字服务器不是很难,如果想实现超出继承的应用,最好寻求一些帮助,socketserver模块是标准库中很多服务器框架的基础,这些服务器架构包括BaseHTTPServer、SimpleHTTPServer、CGIHTTPServer、SimpleXMLRPCServer、DocXMLRPCServer,所有的这些服务器框架都为基础服务器增加了特定功能;
socketserver内部使用 IO多路复用 以及 “多线程” 和 “多进程” ,从而实现并发处理多个客户端请求的Socket服务端。即:每个客户端请求连接到服务器时,Socket服务端都会在服务器是创建一个“线程”或者“进程” 专门负责处理当前客户端的所有请求
ThreadingTCPServer(多线程,真并发)
ThreadingTCPServer实现的Soket服务器内部会为每个client创建一个 “线程”,该线程用来和客户端进行交互。
使用ThreadingTCPServer:
- 创建一个继承自 SocketServer.BaseRequestHandler 的类
- 类中必须定义一个名称为 handle 的方法
- 启动ThreadingTCPServer
用socketserver对ssh程序做修改,实现多用户同时操作互不影响
1 #!/usr/bin/env python 2 # -*- coding:utf-8 -*- 3 #-Author-Lian 4 5 #scoketserver 6 7 import socketserver,os 8 9 class Myserver(socketserver.BaseRequestHandler): 10 def handle(self): 11 while True: 12 conn = self.request 13 # conn,add = server.accept() 14 while True: 15 print("开始收") 16 client_data = conn.recv(1024) 17 client_data = client_data.decode("utf-8") 18 if client_data == "exit": #收到exit 退出 19 break 20 send_data = os.popen(client_data).read() #执行命令结果,要发送的数据 21 send_data = send_data.encode("utf-8") #转换为bytes类型 22 23 length = str(len(send_data)) #统计发送数据的长度 24 conn.sendall(length.encode("utf-8")) #长度以bytes类型发送过去 25 26 return_value = conn.recv(1024) 27 return_value = return_value.decode("utf-8") 28 29 if return_value == "start": 30 if not send_data: # 如果执行结果为空,表示命令不存在 31 conn.sendall((client_data +"命令不存在").encode("utf-8")) 32 else: 33 conn.sendall(send_data) 34 conn.close() 35 36 if __name__ == '__main__': 37 server = socketserver.ThreadingTCPServer(("127.0.0.1",8888),Myserver) 38 server.serve_forever() 39 40 ssh 服务端多用户同时连接