1、核心IO多路复用部分

开发简单的IO多路复用web框架

 1 # -*- coding:utf-8 -*-
 2 import socket
 3 import select
 4 
 5 
 6 class Snow():
 7 
 8     def __init__(self):
 9         self.inputs = set()
10 
11     def run(self,ip="localhost",port=9999):
12         sock = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
13         sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
14         sock.bind((ip,port))
15         sock.setblocking(False)
16         sock.listen(128)
17         self.inputs.add(sock)
18 
19         while True:
20             # 使用select模块达到io多路复用
21             readable_list, writeable_list, error_list = select.select(self.inputs, [], self.inputs, 0.005)
22             for conn in readable_list:
23                 if sock is conn:
24                     # 新建连接
25                     client,address = conn.accept()
26                     client.setblocking(False)
27                     self.inputs.add(client)
28                 else:
29                     # 接收数据get/post
30                     recv_bytes = bytes("",encoding="utf-8")
31                     while True:
32                         try:
33                             _recv = conn.recv(8096)
34                             recv_bytes += _recv
35                         except:
36                             # 循环收齐数据后,由于set blocking(False),所以出发except
37                             break
38                     print(recv_bytes)
39                     conn.sendall(bytes("HTTP/1.1 200 OK\r\nContent-Length: {len}\r\n\r\n{body}".format(len=len("hello world"),body="hello world"),encoding="utf-8"))
40                     self.inputs.remove(conn)
41 
42 core/main.py
core/main.py

相关文章: