Python SocketServer

一. SocketServer 模块, socketServer 为各种基于 socket 的服务器提供了一个框架. 该模块提供了大量的类, 你可以用它们来创建不同的服务器. 
    BaseServer类是一个基类, 其下有不同的继承,但本质上讲, 这些类都是实现bind, listen, accept的封装;
    另外, 所采用的是 select轮循的机制, 还实现了多进程, 多线程的封装

class BaseServer:
    def server_activate(self):                      Called by constructor to activate the server
    def serve_forever(self, poll_interval=0.5):     Handle one request at a time until shutdown.
    def shutdown(self):                             Stops the serve_forever loop
    def handle_request(self):                       Handle one request, possibly blocking, provide select.select funciton
    def _handle_request_noblock(self):              Handle one request, without blocking
    def handle_timeout(self):                       Called if no new request arrives within self.timeout
    def verify_request(self, request, client_address):  Verify the request.  May be overridden. Return True if we should proceed with this request.
    def process_request(self, request, client_address): Call finish_request.
    def server_close(self):                             Called to clean-up the server
    def finish_request(self, request, client_address):  Finish one request by instantiating RequestHandlerClass.
    def close_request(self, request):                   Called to clean up an individual request.
    def handle_error(self, request, client_address):    Handle an error gracefully.  May be overridden.

class TCPServer(BaseServer):
    def server_bind(self):          Called by constructor to bind the socket.
    def server_activate(self):      Called by constructor to activate the server. self.socket.listen(self.request_queue_size)
    def server_close(self):         Called to clean-up the server.
    def fileno(self):               Return socket file number. Interface required by select().
    def get_request(self):          Get the request and client address from the socket. May be overridden. return self.socket.accept()
    def close_request(self, request):   Called to clean up an individual request.

class UDPServer(TCPServer):
    def get_request(self):              self.socket.recvfrom
    def server_activate(self):          No need to call listen() for UDP
    def close_request(self, request):   No need to close anything

class ForkingMixIn:             Mix-in class to handle each request in a new process
class ThreadingMixIn:           Mix-in class to handle each request in a new thread

class ForkingUDPServer(ForkingMixIn, UDPServer): pass
class ForkingTCPServer(ForkingMixIn, TCPServer): pass

class ThreadingUDPServer(ThreadingMixIn, UDPServer): pass
class ThreadingTCPServer(ThreadingMixIn, TCPServer): pass

class UnixStreamServer(TCPServer):
class UnixDatagramServer(UDPServer):

class ThreadingUnixStreamServer(ThreadingMixIn, UnixStreamServer): pass
class ThreadingUnixDatagramServer(ThreadingMixIn, UnixDatagramServer): pass

----------------------
BaseRequestHandler类主要用来封装数据的收发功能:

class BaseRequestHandler:       Base class for request handler classes
    def setup(self):
    def handle(self):
    def finish(self):

class StreamRequestHandler(BaseRequestHandler):
    def setup(self):
        self.connection = self.request
        self.rfile = self.connection.makefile(' rb' , self.rbufsize)
        self.wfile = self.connection.makefile(' wb' , self.wbufsize)'')'')
        # - rfile: a file object from which receives the request is read
        # - rfile: 这个文件对应着从 socket 进来的数据。等同于调用 request.makefile(‘rb’) 。
        # - wfile: a file object to which the reply is written
        # - wfile: 这个文件对应着从 socket 发送的数据。等同于调用 request.makefile(‘wb’)。
    def finish(self):
        if not self.wfile.closed:
            self.wfile.flush()
        self.wfile.close()
        self.rfile.close()

class DatagramRequestHandler(BaseRequestHandler):
    """Define self.rfile and self.wfile for datagram sockets."""

    def setup(self):
        try:
            from cStringIO import StringIO
        except ImportError:
            from StringIO import StringIO
        self.packet, self.socket = self.request
        self.rfile = StringIO(self.packet)
        self.wfile = StringIO()

    def finish(self):
        self.socket.sendto(self.wfile.getvalue(), self.client_address)        

            
--------------------------------------

二. BaseHTTPServer, 这是一个建立在 SocketServer 框架上的基本框架, 用于 HTTP 服务器.  

class HTTPServer(SocketServer.TCPServer):
    def server_bind(self):              重载方法:SocketServer.TCPServer.server_bind(self)来对套接字进行绑定

class BaseHTTPRequestHandler(SocketServer.StreamRequestHandler):
这个类被用来处理到达服务器的 HTTP 请求, 单独地,它不能响应任意实际的 HTTP 请求,必须是子类来处理每个请求方法 (例如, GET 或 POST)
BaseHTTPRequestHandler 通过子类为使用提供一些类和实例变量以及方法, 该处理操作程序将解析请求和头,然后调用请求类型的具体方法

BaseHTTPRequestHandler 有下列实例变量:
client_address:     包含关连的客户端地址这样格式(host, port)的一个元组
command:            包含的命令 (请求类型)。例如,'GET'
path:               包含的请求路径
request_version:    包含请求版本的字符串。例如,'HTTP/1.0'
headers:            控制(Holds)由MessageClass 类变量指定的类的一个实例。这个实例解析和管理 HTTP 请求中的头
rfile:              包含一个输入流,定位在可选的输入数据开头
wfile:              包含写到客户端响应的输出流。当写给这个流时坚持使用正确的HTTP协议

BaseHTTPRequestHandler 有下列类变量:
server_version:         指定服务器软件版本。你可能想要重载它。格式是多个空格分隔的字符串,每个字符串的格式是name[/version]。例如,'BaseHTTP/0.2'
sys_version:            包含Python系统版本,通过 version_string 方法和 server_version 类变量,以一种方便可用的格式。例如,'Python/1.4'
error_message_format:   为构建响应到客户端的错误构建一个格式字符串
protocol_version:       这指定在响应中使用的 HTTP 协议版本。如果设置为 'HTTP/1.1',服务器将允许 HTTP 持续连接;
                        然而,那么你的服务器必须 在所有它到客户端响应中包含一个正确的Content-Length 头 (使用 send_header())
                        为了向下的兼容性,缺省设置为 'HTTP/1.0'
MessageClass:           指定一个类似于rfc822.Message 的类解析 HTTP 头。典型地,不被重载,并且缺省为 mimetools.Message。
responses:              这个变量包含一个错误代码整数到包含一个短的和一个长的信息的两个元素的元组的映射

BaseHTTPRequestHandler 实例有下列方法:
parse_request:                  解析从rfile中得到的那个command + path
handle():                       调用 handle_one_request()一次 (如果能够持续连接,多次) 处理进来的 HTTP 请求, 从不需要重载它,而应实现对应的 do_*() 方法
handle_one_request()            这个方法将解析和分派请求到对应的 do_*() 方法, 从不需要重载它。
send_error(code[, message])     发送并记录一个完整的错误回复到客户端。数字的 code 指定 HTTP 错误代码,以 message 作为可选的,更多指定的文本
send_response(code[, message])  发送一个响应头并记录已接收的请求。HTTP 响应行被发送,后面紧跟 Server 和 Date 头
send_header(keyword, value)     编写一个指定的 HTTP 头到输出流。 keyword 应该指定头关键字,value 指定它的值。
end_headers()                   发送一个空白行,表示响应中的 HTTP 头结束。
log_request([code[, size]])     记录一个已接收的 (成功的) 请求。code 指定关联响应的数字的 HTTP 代码。如果响应的大小可用,那么它应该作为 size 参数被传递。
log_error(...)                  当一个请求不能被完成时记录一个错误。缺省,它传递信息给 log_message(),因此它取相同的参数 (format 和 附加值)。
log_message(  format,...)       记录一个随机信息给 sys.stderr。典型地重载创建自定义的错误日志结构, 客户端地址和当前的日期时间被作为记录的每个信息的前缀。
version_string()                返回服务器软件的版本字符串。这是一个 server_version 和 sys_version 类变量的联合。
date_time_string([timestamp])   返回通过timestamp给定的日期和时间(必须由 time.time()返回的格式),格式化一个信息头,如果timestamp被省略,使用当前日期和时间
log_date_time_string()          返回当前的日期和时间,格式化日志。
address_string()                返回客户端地址,格式化日志。一个名称的查找被执行在客户端的IP地址上。
### 回答1: Pythonsocketserver 模块提供了基于 Socket 的服务器基类。它是基于类的,可以帮助您轻松地创建多线程或多进程的网络服务器。 socketserver 模块提供了以下几种服务器类:TCPServer、UDPServer、UnixStreamServer 和 UnixDatagramServer。 ### 回答2: Python SocketServerPython 编程语言的标准库之一,用于创建网络服务器和客户端的程序。SocketServer 提供了一个有力的框架,使得 Python 编写网络服务器和客户端程序更加容易。 Python SocketServer 的主要功能是提供了一个可扩展的框架,使得它非常容易创建定制的服务器和客户端应用程序。SocketServer 包含了多个类和方法,可以支持 TCP 和 UDP 协议,同时支持单线程也支持多线程,提供了简单的接口,允许用户很方便地创建网络应用程序。 Python SocketServer 提供了多个类,包括 ThreadingMixIn 类和 ForkingMixIn 类等,可以实现线程和进程的管理,使得服务器能够同时处理多个客户端的请求。这些类提供了一些方法,如 handle() 和 finish() 等,可用于处理客户端请求和完成服务器响应。 Python SocketServer 还有一些有用的子类,如 TCPServer、UDPServer、BaseServer 等,它们都封装了一些基本的网络协议和方法,使得网络编程更加简单。 Python SocketServer 的使用方法相对简单,我们只需要继承一些基本的类和方法,并重写它们。我们可以根据自己的需要,来实现网络服务器和客户端的功能。 总的来说,Python SocketServer 提供了很强大的功能和易于使用的接口,能够为 Python 的网络编程提供很好的支持。无论是初学者还是专业人士,都可以利用它来实现各种网络应用程序。 ### 回答3: Python中的socketserver是实现网络通信的标准库。它提供了一组类和方法,可以帮助程序员轻松地创建基于Socket的网络服务器和客户端。这个库是基于Python的标准Socket库的,它简化了网络编程的过程,大大降低了错误率和代码复杂度。 Pythonsocketserver库包含了两个主要的类,分别是服务器类和请求类。服务器类是用户自己定义的,继承于socketserver.BaseServer。请求类则是系统预定义的,继承于socketserver.BaseRequestHandler。 socketserver的主要特性如下: 1. 支持TCP和UDP传输协议,灵活、通用。 2. 支持多线程,可以同时处理多个客户端请求,有效提高了服务端的处理并发能力。 3. 支持多进程,可以将服务端实现分布式部署,支持高可用性和拓展性。 4. 支持异步I/O模型,IO阻塞量较小,效率更高。 使用socketserver可以很容易地实现一个简单的服务端和客户端。对于初学者来说,学习socketserver可以更好地了解网络通信的工作原理,掌握基本的网络编程技能。对于实际应用中,我们可以利用socketserver的高并发模式,支持大量的客户端访问,提升系统的处理能力和效率,满足业务需求。 总之,Python socketserver是一个非常有用的网络编程库,以简单、易学、高效、稳定等特点广泛应用于实际开发中。无论是初学者还是经验丰富的开发者,都可以使用它来实现各种网络通信服务。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值