python 64式: 第19式、异步多连接socket通信服务端

#!/usr/bin/env python
# -*- coding: utf-8 -*-

from BaseHTTPServer import BaseHTTPRequestHandler
from BaseHTTPServer import HTTPServer
from SocketServer import ForkingMixIn

'''
关键:
1 BaseHTTPServer.HTTPServer(server_address, RequestHandlerClass)
含义: 是SocketServer.TCPServer子类
函数: 
TCPServer(BaseServer).__init__(self, server_address, RequestHandlerClass, bind_and_activate=True)
参数:
server_address:是一个元组,(host, port)
RequestHandlerClass: 请求处理类,可继承自BaseHTTPServer.BaseHTTPRequestHandler的对象
处理过程: 创建和监听HTTP的socket,分发请求到一个处理器

2 SocketServer.ForkingMixIn()
含义: SocketServer模块简化了网络服务器的写任务,ForkingMixIn可以创建
        一个单独的进程或线程来处理每个请求。
本质: 让单进程服务器变为多进程服务器。每次处理用户请求会开启新的进程。
      支持异步模型。实际是采用多进程(分叉)实现异步。
      类似得: ThreadingMixIn 利用多线程实现异步。
好处: 
1 实现异步,2支持多连接。 
所以ForkingMixIn实际是核心。

3 BaseHTTPServer.BaseHTTPRequestHandler(request, client_address, server)
含义: 这个类用于处理HTTP请求。它必须被子类继承来处理每隔请求方法。
     例如(GET,或者POST)。这个类提供了许多类和实例的变量,方法被子类使用。
处理过程: 
1)这个处理器将会解析请求和头部,接着调用指定请求类型的一个方法。该方法名称
 是从请求中被构建。
2)例如,请求方法是SPAM,那么do_SPAM()方法将会被无参形式调用。
3)所有相关的信息都被存储在该处理器的实例变量中。子类不需要覆盖或扩展__init__()方法
成员变量:
client_address: 包含一个元组(host, port)指向客户端地址
server: 包含server实例
command: 请求类型,例如GET
path: 请求路径
headers: 时一个类的实例,包含http请求的头部信息
rfile: 输入漏,执行可选输入数据的起始位置
wfile: 包含输出流,用于将响应写回到客户端。
典型用法: self.wfile.write(str)

成员方法:
send_response(code, message):发送响应头部,日志记录接受的请求
send_header(keyword, value):写一个明确的HTTP头部到输出流。keyword应该指定头部关键字
end_headers(keyword, value): 发送一个空行,表明HTTP头部在响应中结束


4 创建一个socket服务端的步骤:
1) 创建一个请求处理类(继承自某个基类),指定处理方法
2) 实例化一个socket服务器,指定(ip, port),并指定1中请求处理类的实例
3) 开启socket服务起的serve_forever()方法处理请求

5 发送请求命令如下:
curl -X GET http://127.0.0.1:8044/

参考:
[1] https://blog.csdn.net/zhou8201/article/details/58597985
[2] https://docs.python.org/2.7/library/basehttpserver.html#module-BaseHTTPServer
[3] https://blog.csdn.net/tycoon1988/article/details/39989203
'''

class MyHTTPRequestHander(BaseHTTPRequestHandler):
    def __init__(self, *args, **kwargs):
        # super(MyHTTPRequestHander, self).__init__(*args, **kwargs)
        # 注意,这里使用的是父类的初始化函数
        BaseHTTPRequestHandler.__init__(self, *args, **kwargs)

    def do_GET(self):
        print "###### enter do_Get"
        # TODO(), add process code below
        self.send_response(200)
        self.end_headers()
        self.wfile.write('hello world')


class MyHTTPServer(ForkingMixIn, HTTPServer):
    pass

def startServer(host, port, handler):
    server = MyHTTPServer((host, port), handler)
    server.serve_forever()

def handler(*args, **kwargs):
    MyHTTPRequestHander(*args, **kwargs)

def process():
    host = ''
    port = 8044
    startServer(host, port, handler)

if __name__ == "__main__":
    process()

猜你喜欢

转载自blog.csdn.net/qingyuanluofeng/article/details/84560187