python——tcp协议实现简单的静态网站服务器

概述:静态网站是指全部由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()

访问效果如下:(访问的首页可点击进行静态网页跳转)

python——tcp协议实现简单的静态网站服务器_第1张图片

你可能感兴趣的:(python)