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服务-函数