简单介绍:
此模块儿提供了服务器中心类,常用来简化网络服务器的开发,提供了TCPServer/UDPServer/UnixStreamServer/UnixDatagramServer,四个同步类,也就是说请求过来后,其将同步处理数据,处理完后才能处理下一个请求,要实现一项服务,还必须派生一个handler class请求处理类,并重写父类的handle()方法,handle()方法是用来处理请求的,该模块儿是通过服务类和请求处理类组合来处理请求的
相关服务类:
SocketServer.TCPServer
说明: TCP服务类
SocketServer.UDPServer
说明: UDP服务类
SocketServer.UnixStreamServer
SocketServer.UnixDatagramServer
请求处理类:
SocketServer.StreamRequestHandler
说明: 处理流式套接字类
SocketServer.DatagramRequestHandler
说明: 处理数据报套接字类
异步相关类:
SocketServer.ForkingMixIn
说明: 利用多进程处理多路IO
SocketServer.ThreadingMixIn
说明: 利用多线程处理多路IO
创服务步骤: 阻塞型
1.创建一个request handler class请求处理类, 继承自RequestHandler class并重写它的handle()方法,该方法将处理请求
2.实例化一个server class对象,并将服务器的地址和之前创建的request handler class传递给它
3.调用server class对象的handle_request()或serve_forever()方法开始处理请求
#!/usr/bin/env python
# -*- coding: utf-8 -*-
"""
#
# Authors: limanman
# OsChina: http://my.oschina.net/pydevops/
# Purpose:
#
"""
import sys
from SocketServer import (StreamRequestHandler, TCPServer)
# 重写处理类的handle方法
class RequestHandler(StreamRequestHandler):
def handle(self):
# self.request 为cur_socket
# self.rfile相当于client_socket.makefile('r', 0)句柄
# self.wfile相当于client_socket.makefile('w', 0)句柄
client_addr = self.request.getpeername()
server_addr = self.request.getsockname()
print 'notice: client %s -> server %s' % (repr(client_addr),
repr(server_addr))
while True:
cur_line = self.rfile.readline()
if not cur_line.strip():
break
self.wfile.write('Recived: %s' % (cur_line.upper()))
# 关闭底层句柄
self.rfile.close()
self.wfile.close()
self.request.close()
# 传进来重写的处理类实例化服务类
server = TCPServer(('', 8888), RequestHandler)
# 开始处理请求
server.serve_forever()
创服务步骤: 非阻塞
1.创建一个request handler class请求处理类, 继承自RequestHandler class并重写它的handle()方法,该方法将处理请求
2.重写一个继承自ForkingMixIn/ThreadingMixIn和server class的新类
3.实例化新类对象,并将服务器的地址和之前创建的request handler class传递给它
4.调用新类对象继承下来的handle_request()或serve_forever()方法开始处理请求
#!/usr/bin/env python
# -*- coding: utf-8 -*-
"""
#
# Authors: limanman
# OsChina: http://my.oschina.net/pydevops/
# Purpose:
#
"""
import sys
from SocketServer import (ThreadingMixIn, StreamRequestHandler, TCPServer)
# 支持多线程的服务类,注意是多继承
class Server(ThreadingMixIn, TCPServer):
pass
# 重写处理类的handle方法
class RequestHandler(StreamRequestHandler):
def handle(self):
# self.request 为cur_socket
# self.rfile相当于client_socket.makefile('r', 0)句柄
# self.wfile相当于client_socket.makefile('w', 0)句柄
client_addr = self.request.getpeername()
server_addr = self.request.getsockname()
print 'notice: client %s -> server %s' % (repr(client_addr),
repr(server_addr))
while True:
cur_line = self.rfile.readline()
if not cur_line.strip():
break
self.wfile.write('Recived: %s' % (cur_line.upper()))
# 关闭底层句柄
self.rfile.close()
self.wfile.close()
self.request.close()
# 传进来重写的处理类实例化服务类
server = Server(('', 8888), RequestHandler)
# 开始处理请求
server.serve_forever()