python 网络编程-05 socketserver
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 BaseRequestHandlerclass and overriding its handle() 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()