概述:静态网站是指全部由HTML(标准通用标记语言的子集)代码格式页面组成的网站,所有的内容包含在网页文件中。网页上也可以出现各种视觉动态效果,如GIF动画、FLASH动画、滚动字幕等,而网站主要是静态化的页面和代码组成,一般文件名均以htm、html、shtml等为后缀。
需求:使用tcp协议编写一个简单静态网页服务器,使用户可以通过浏览器访问所有的html网页(或博客);
tcp简介:TCP是一种面向连接的、可靠的、基于字节流的传输层通信协议,TCP为了保证不发生丢包,就给每个包一个序号,同时序号也保证了传送到接收端实体的包的按序接收。然后接收端实体对已成功收到的包发回一个相应的确认(ACK);如果发送端实体在合理的往返时延(RTT)内未收到确认,那么对应的数据包就被假设为已丢失将会被进行重传。TCP用一个校验和函数来检验数据是否有错误;在发送和接收时都要计算校验和。
python的socket套接字中就提供了tcp协议的使用,具体实现如下:
import socket
import re
def serverce_client(new_socket):
"""处理客户端到来的请求"""
# 1 接受客户端请求,解堵塞
request = new_socket.recv(1024).decode("utf-8")
print(request)
request_lines = request.splitlines()
print("")
print(">"*20)
print(request_lines)
# 请求格式 GET /favicon.ico HTTP/1.1
# 根据请求格式建立正则
file_name = ""
ret = re.match(r'[^/]+(/[^ ]*)',request_lines[0])
if ret:
file_name = ret.group(1)
print("-"*20, file_name)
if file_name == '/':
file_name = '/index.html'
# 2 返回消息给浏览器
# 2.1 返回消息分两部分,请求头和body,中间用空行分开
try:
fp = open("./html"+ file_name,"rb")
except:
response_404 = "HTTP/1.1 404 NOT FOUND \r\n"
response_404 += "\r\n"
response_404 += "-----file not found -----"
new_socket.send(response_404.encode("utf-8"))
else:
html_content = fp.read()
fp.close()
# 2.2 准备发送给浏览器的请求头
response_header = "HTTP/1.1 200 OK\r\n"
response_header += "\r\n"
# 2.3 header和body分别发送给请求的浏览器
new_socket.send(response_header.encode("utf-8"))
new_socket.send(html_content)
# 3 关闭处理的套接字
new_socket.close()
def main():
"""tcp协议实现静态浏览器"""
# 1 创建一个socket套接字
tcp_server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
tcp_server_socket.setsockopt(socket.SOL_SOCKET,socket.SO_REUSEADDR, 1)
# 2 绑定一个端口
tcp_server_socket.bind(("",7890))
# 3 监听套接字
tcp_server_socket.listen(128)
while True:
# 4 等待客户端的链接
new_socket, clien_addr = tcp_server_socket.accept()
# 5 为这个客户端服务
serverce_client(new_socket)
# 6 关闭套接字
tcp_server_socket.close()
if __name__ == "__main__":
main()
访问效果如下:(访问的首页可点击进行静态网页跳转)