socketserver模块
虽说用Python编写简单的网络程序很方便,但复杂一点的网络程序还是用现成的框架比较好。这样就可以专心事务逻辑,而不是套接字的各种细节。SocketServer模块简化了编写网络服务程序的任务。同时SocketServer模块也是Python标准库中很多服务器框架的基础。
socketserver模块可以简化网络服务器的编写,Python把网络服务抽象成两个主要的类,一个是Server类,用于处理连接相关的网络操作,另外一个则是RequestHandler类,用于处理数据相关的操作。并且提供两个MixIn 类,用于扩展 Server,实现多进程或多线程。
Server类
它包含了种五种server类,BaseServer(不直接对外服务)。TCPServer使用TCP协议,UDPServer使用UDP协议,还有两个不常使用的,即UnixStreamServer和UnixDatagramServer,这两个类仅仅在unix环境下有用(AF_unix)。
RequestHandler类
所有requestHandler都继承BaseRequestHandler基类。
创建一个socketserver 的步骤
- First, you must create a request handler class by subclassing the
BaseRequestHandler
class and overriding itshandle()
method; this method will process incoming requests. - Second, you must instantiate one of the server classes, passing it the server’s address and the request handler class.
- Then call the
handle_request()
orserve_forever()
method of the server object to process one or many requests. - Finally, call
server_close()
to close the socket.
流程图
单线程示例
from socket import * ip_port=('127.0.0.1',8888) tcp_socket_server=socket() tcp_socket_server.bind(ip_port) tcp_socket_server.listen(5) while 1: conn,addr=tcp_socket_server.accept() print('客户端',addr) while 1: client_data=conn.recv(1024) if len(client_data)==0: print("客户端断开连接,等待新的用户连接....") break print ("接受数据 >>>",str(client_data,"utf8")) response=input("响应数据 >>>") conn.sendall(bytes(response,"utf8")) conn.close() ################################################################################ import socket ip_port = ('127.0.0.1',8888) sock = socket.socket() sock.connect(ip_port) print ("客户端启动:") while True: inp = input('发送数据 >>>') if inp == 'exit': break sock.sendall(bytes(inp,"utf8")) server_response=sock.recv(1024) print ("服务端响应数据 >>>",str(server_response,"utf8")) sock.close()
并发示例
import socketserver class Myserver(socketserver.BaseRequestHandler): def handle(self): while 1: client_data=self.request.recv(1024) if len(client_data)==0: print("客户端断开连接,等待新的用户连接....") break print ("接受数据 >>>",str(client_data,"utf8")) response=input("响应数据 >>>") self.request.sendall(bytes(response,"utf8")) self.request.close() server=socketserver.ThreadingTCPServer(("127.0.0.1",8888),Myserver) server.serve_forever() ###################################################################### import socket ip_port = ('127.0.0.1',8888) sock = socket.socket() sock.connect(ip_port) print ("客户端启动:") while True: inp = input('发送数据 >>>') if inp == 'exit': break sock.sendall(bytes(inp,"utf8")) server_response=sock.recv(1024) print ("服务端响应数据 >>>",str(server_response,"utf8")) sock.close()