下面代码实现的在浏览器地址栏中输入网址,服务器会根据输入的地址,自动返回一个页面。
其中动态页面,暂时以简单的英文展示。后面会陆续完善此框架的搭建。
将下面的代码运行起来之后,在浏览器地址栏中输入相应的地址,就可以返回一个页面出来。
import re
import socket
import gevent
from gevent import monkey
monkey.patch_all()
class MySever(object):
"""服务器类"""
def __init__(self):
"""服务器初始化"""
self.sever = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
self.sever.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
self.sever.bind(("", 8080))
self.sever.listen(128)
def run_sever(self):
"""启动服务器,与客户端连接"""
while True:
client, addr = self.sever.accept()
# 创建协程
gevent.spawn(self.client_handle, client)
def client_handle(self, client):
"""处理客户端请求"""
# 接收客户端请求
recv_data = client.recv(1024).decode("utf-8")
# 如果数据为空,需返回
if not recv_data:
client.close()
return
# 解析请求,获取请求中的地址
data = re.match("[^/]+(/[^ ]*)", recv_data)
if data:
url_addr = data.group(1)
if url_addr == "/":
url_addr = "/index.html"
else:
head = "HTTP/1.1 404 NOT FOUND\r\n"
body = "can not found your request."
content = head + "\r\n" + body
client.send(content.encode("utf-8"))
print(url_addr)
# 根据不同的请求,给出不同的响应内容
if url_addr.endswith(".html"):
if url_addr == "/center.html":
body = "center page is showing "
elif url_addr == "/login.html":
body = "loging page is showing "
elif url_addr == "favorite.html":
body = "my favorite page is showing"
elif url_addr == "/aboutqt.html":
body = "this page is very special ,这个页面很特殊,您最好不要去访问!"
else:
try:
with open("./html%s" % url_addr, "r") as f:
body = f.read()
except Exception:
body = "the page you write does not exist"
body = body.encode("utf-8")
else:
try:
with open("./html%s" % url_addr, "rb") as f:
body = f.read()
except Exception:
body = "this content can not be found ".encode("utf-8")
# 作出响应
head = "HTTP/1.1 200 OK\r\n" + "content-type:text/html;charset=utf-8\r\n"
content = head + "\r\n"
client.send(content.encode("utf-8"))
client.send(body)
# 关闭套接字
client.close()
def main():
"""http服务器"""
# 服务器初始化
tcp_sever = MySever()
# 运行服务器
tcp_sever.run_sever()
if __name__ == '__main__':
main()
上面代码主题的思路是面向对象去实现的。