Python 多线程Web服务器的设计与实现

 Python
 

代码先行:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
import socket
import re
import threading
import time

CRLF = "\r\n"
contentTypeLine = "Content-type:";


def server(conn, addr):
data = conn.recv(2048)
data1=data.decode()
print(data1)
print("----------------------------\n")
f = data.decode('utf-8').split(' ')[1]

try:
x = open('.'+f, "rb").read()
conn.send(bytearray("HTTP/1.1 200 OK" + CRLF, 'utf8'))
conn.send(bytearray(contentTypeLine + webtype(f) + CRLF, 'utf8'))
conn.send(bytearray("Date:" + time.strftime("%Y-%m-%d %H:%M:%S", time.localtime()) + CRLF, 'utf8'))
conn.send(bytearray(CRLF, 'utf8'))
conn.send(x)
except IOError:
conn.send(bytearray("HTTP/1.1 404 NotFound" + CRLF, 'utf8'))
conn.send(bytearray(contentTypeLine + "text/html" + CRLF, 'utf8'))
conn.send(bytearray("Date:" + time.strftime("%Y-%m-%d %H:%M:%S", time.localtime()) + CRLF, 'utf8'))
conn.send(bytearray(CRLF, 'utf8'))
conn.send(bytes("<h1>404</h1>", 'utf8'))

conn.close()

def webtype(filename):
a = filename.split('.')[1]
if a == 'txt':
return 'text/html'
if a == 'jpg':
return 'image/jpeg'
return "other type"

if __name__ == '__main__':
ip_port = ('', 9999)//不填的话默认本地IP(内网IP)放服务器的话可以不填,也可以填写服务商给的内网ip
web = socket.socket()
web.bind(ip_port)
web.listen(5)
print('opening...PORT:9999')
while True:
conn, addr = web.accept()
thread = threading.Thread(target=server, args=(conn, addr))
thread.start()

把我遇到的问题在这里说明一下:
1.修改MacOS下默认的python版本(macos默认python版本为2.7)

首先点击下载python3.7 并安装
查看本级上的python3命令目录

1
which python3

修改bashrc配置文件

1
vi ~/.bashrc

想要为某个特定用户修改 Python 版本,只需要在其 home 目录下创建一个 alias(别名) 即可。打开该用户的 ~/.bashrc 文件,添加新的别名信息来修改默认使用的 Python 版本。

1
alias python='/usr/local/bin/python3.7'

重新加载 .bashrc 文件,使操作生效

1
. ~/.bashrc

2.安装Pycharm IDE(python专用)
需要破解,过程也是很麻烦的0.0,本人已成功破解。嘻嘻
破解参考网址

PyCharm的注册码获取
http://idea.lanyus.com

激活码使用
https://blog.csdn.net/u014044812/article/details/78727496

为Mac OS X启用Root账户
https://jingyan.baidu.com/article/49711c619e7620fa441b7ca8.html

3.最后一点是代码里需要注意地方