模块和包.SocketServer

简单介绍:

此模块儿提供了服务器中心类,常用来简化网络服务器的开发,提供了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()


你可能感兴趣的:(模块和包.SocketServer)