1、核心IO多路复用部分

![]()
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