http服务器

Posted Gloo

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了http服务器相关的知识,希望对你有一定的参考价值。

1. 返回固定页面的http服务器

首先我们知道http协议是基于tcp协议的,所以我们只要使用套接字返回固定格式的字符串就可以在浏览器上显示

  1 import socket
  2 
  3 
  4 def service_client(client_socket):
  5     # 接收客户端的请求
  6     recv_msg = client_socket.recv(1024)
  7 
  8     # 获取请求头的第一行并打印
  9     request_header = recv_msg.decode()
  6     recv_msg = client_socket.recv(1024)
  7 
  8     # 获取请求头的第一行并打印
  9     request_header = recv_msg.decode()
 10     request_url = request_header.splitlines()[0]
 11     print("-"*50)
 12     print("\\033[31m" + request_url + "\\033[0m")
 13 
 14     # 拼接固定字符串
 15     response = "HTTP/1.1 200 ok\\r\\n"
 16     response += "\\r\\n"
 17     response += "<h1>hello world</h1>"
 18 
 19     # 将响应的字符串发送给浏览器端并关闭套接字
 20     client_socket.send(response.encode())
 21     client_socket.close()
 22 
 23 
 24 def main():
 25     # 创建socket套接字
 26     http_server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
 27     http_server_socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
 28     # 绑定地址
 29     http_server_socket.bind(("192.168.219.177", 8080))
 30 
 31     # 使套接字变为被动监听状态
 32     http_server_socket.listen(128)
 33 
 34     # 等待客户端连接
 35     while True:
 36         client_socket, client_addr = http_server_socket.accept()
 37 
 38         service_client(client_socket)
 39 
 40     # 关闭监听套接字
 41     http_server_socket.close()
 42 
 43 
 44 if __name__ == "__main__":
 45     main()

浏览器显示效果:

当我们完成一个简单的返回固定页面的http服务器后。我们就可以根据浏览器请求的url显示出固定的页面。实现一个静态http服务器。

  2 import re
  3 
  4 
  5 def service_client(client_socket):
  6     # 接收客户端的请求
  7     recv_msg = client_socket.recv(1024)
  8 
  9     request_header = recv_msg.decode()
 10     request_url = request_header.splitlines()[0]
 11     print("-"*50)
 12     print("\\033[31m" + request_url + "\\033[0m")
 13 
 14     # 默认显示index页面 
 15     file_name = "/index.html"
 16 
 17     # 匹配出请求头的第一行 
 18     file_re_obj = re.match("[^/]+(/[^ ]+)", request_url)
 19 
 20     # 如果匹配到url中的文件名,将其赋值给file_name
 21     if file_re_obj:
 22          file_name = file_re_obj.group(1)
 23 
 24     try:
 25         # 以二进制的格式打开templates文件夹中的静态文件
 26         with open("templates" + file_name, "rb") as f:
 27             data = f.read()
 28     except:
 29         # 如果没有文件夹中没有用户所需要的页面,返回404
 30         response = "HTTP/1.1 404 NOT FOUND\\r\\n"
 31         response += "\\r\\n"
 32         response += "<h1>404 NOT FOUND</h1>"
 33         client_socket.send(response.encode())
 34     else:
 35         # 拼接响应头
 36         response = "HTTP/1.1 200 ok\\r\\n"
 37         response += "\\r\\n"
 38         # 拼接byte类型的响应头和响应体并返回
 39         client_socket.send(response.encode()+data)
 40 
 41     # 关闭套接字
 42     client_socket.close()
 43 
 44 
 45 def main():
 46     # 创建socket套接字
 47     http_server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
 48     http_server_socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
 49     # 绑定地址
 50     http_server_socket.bind(("192.168.219.177", 8080))
 51 
 52     # 使套接字变为被动监听状态
 53     http_server_socket.listen(128)
 54 
 55     # 等待客户端连接
 56     while True:
 57         client_socket, client_addr = http_server_socket.accept()
 58 
 59         service_client(client_socket)
 60 
 61 
 62     http_server_socket.close()
 63 
 64 
 65 if __name__ == "__main__":
 66     main()

 

以上是关于http服务器的主要内容,如果未能解决你的问题,请参考以下文章

代码适用于与单个 html 文件不同的堆栈片段

在哪里以及如何使用片段填充我的标签

高效Web开发的10个jQuery代码片段

Flutter 报错 DioError [DioErrorType.DEFAULT]: Bad state: Insecure HTTP is not allowed by platform(代码片段

如何从一个片段导航到另一个片段?

这两个代码片段有啥区别?