1. IO多路复用
2. paramiko
3. MySQL
- SQL语句
- Python操作MySQL - pymysql模块



今日内容:
1. IO多路复用
- 监听多个socket变化


- socket服务端
IO多路复用 + socket 来实现Web服务器
a. 服务端优先运行
b. 浏览器: http://......
socket + send('协议..')
c. 获取客户端发来的url,根据URL不同响应数据
d. 断开链接
产出:
a. 浏览器发送数据:按照指定规则
b. 监听多个socket对象
c.
Web框架开发者
业务开发者
d. 模块独立化
#!/usr/bin/env python
# _*_ coding:utf-8 _*_

import select
import socket
sock = socket.socket()
sock.setblocking(False)
sock.bind(('127.0.0.1',8888))
sock.listen(5)

def process_data(client):
    data = bytes()
    while True:
        try:
            chunk = client.recv(1024)
        except Exception as e:
            chunk = None
        if not chunk:
            break
        data += chunk
        data_str = str(data,encoding='utf-8')
        header,body = data_str.split('\r\n\r\n', 1)
        header_list = header.split('\r\n')
        header_dick = {}
        for line in header_list:
            value = line.split(":",1)
            if len(value) == 2:
                k,v = value
                header_dick[k] = v
            else:
                header_dick['method'],header_dick['url'],header_dick['protocal'] = line.split(' ')
        return header_dick,body
inputs = [sock,]
while True:
    rlist,wlist,elist = select.select(inputs,[],[],0.05)
    for client in rlist:
        if client == sock:
            conn,addr = client.accept()
            conn.setblocking(False)
            inputs.append(conn)
        else:
            header_dicy,body = process_data(client)
            print(header_dicy)
            request_url = header_dicy['url']
            client.sendall(request_url.encode('utf-8'))
            inputs.remove(client)
            client.close()
http服务-函数

相关文章: