这是一个简单的web服务器, 通过socket下的tcp和python多线程实现。
没有足够的功能, 只能作为一个了解bs模式的样例。
运行:
打开浏览器,输入“localhost:1027”,即可。(首先打开服务器)
[Python] 纯文本查看 复制代码 import socket
import re
import threading
'''
多线程实现web服务器:
# 1、新建线程;
# 2、在新线程中关闭套接字
# 注:线程资源复制,套接字关闭一个就行
'''
def response(new_socket):
data = new_socket.recv(1024).decode("utf-8").splitlines()
print("请求: ")
for item in data:
print(item)
ret = re.search(r'[^/]+(/[^ ]*)', data[0])
print(ret)
if ret:
file_name = ret.group(1)
# print("*"*50, file_name)
if file_name == "/":
file_name = "/index.html"
# 2. 返回http格式的数据,给浏览器
try:
# 网页文件的路径自己设置
f = open("F:/code/python/tmp/web/HTML家政服务公司网站模板" + file_name, "rb")
except:
response = "HTTP/1.1 404 NOT FOUND\r\n"
response += "\r\n"
response += "------file not found-----"
new_socket.send(response.encode("utf-8"))
else:
html_content = f.read()
f.close()
# 2.1 准备发送给浏览器的数据---header
response = "HTTP/1.1 200 OK\r\n"
response += "\r\n"
# 2.2 准备发送给浏览器的数据---boy
# response += "hahahhah"
# 将response header发送给浏览器
new_socket.send(response.encode("utf-8"))
# 将response body发送给浏览器
new_socket.send(html_content)
# 新进程中关闭套接字
new_socket.close()
def main():
# 初始化套接字
tcp_server = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
tcp_server.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
# 1、绑定端口
tcp_server.bind( ('',1027))
# 2、设置监听
tcp_server.listen(128)
while True:
# 3、等待接收
new_server, client_adder = tcp_server.accept()
#4、响应
threading.Thread( target= response,args=(new_server,)).start()
#5、关闭新套接字------此处关闭会导致新套接字无法正常使用
#new_server.close()
# 6、关闭服务器套接字
tcp_server.close()
if __name__ == "__main__":
main()
|