python静态web服务器实现方法及代码详解
作者:laozhang 发布时间:2023-01-13 17:17:12
标签:python,静态,web服务器
1、编写TCP服务器程序。
2、获取浏览器发送的http请求消息数据。
3、读取固定的页面数据,将页面数据组装成HTTP响应消息数据并发送给浏览器。
4、HTTP响应报文数据发送完成后,关闭服务于客户端的套接字。
实例
# 时间: 2021/10/21 20:38
import socket
if __name__ == '__main__':
# 创建tcp服务端套接字
tcp_server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
# 设置端口号复用, 程序退出端口立即释放
tcp_server_socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, True)
# 绑定端口号
tcp_server_socket.bind(("", 8080))
# 设置监听
tcp_server_socket.listen(128)
while True:
# 等待接受客户端的连接请求
new_socket, ip_port = tcp_server_socket.accept()
# 代码执行到此,说明连接建立成功
recv_client_data = new_socket.recv(4096)
# 对二进制数据进行解码
recv_client_content = recv_client_data.decode)
print(recv_client_content)
# 响应行
response_line = "HTTP/1.1 200 OK\r\n"
# 响应头
response_header = "Server: py1.0\r\n"
# 响应体
response_body = "Hello,guys!"
# 拼接响应报文
response_data = (response_line + response_header + "\r\n"+ response_body).encode()
# 发送数据
new_socket.send(response_data)
# 关闭服务与客户端的套接字
new_socket.close()
实例扩展:
import socket
import re
import time
def service_client(new_socket):
"""为这个客户端服务"""
# 1.接收浏览器发送过来的请求,即http请求
# GET / HTTP/1.1
# --------
request = new_socket.recv(1024).decode('utf-8')
# 判断客户端意外断开链接返回空字符串
if not request:
# 关闭套接字并退出
new_socket.close()
print("==="*30)
return
# 分隔套接字
request_lines = request.splitlines()
print()
print(">"*20)
print(request_lines)
file_name = ""
ret = re.match(r"[^/]+(/[^ ]*)", request_lines[0])
if ret:
file_name = ret.group(1)
if file_name == "/":
file_name = "/index.html"
# 2.返回http格式数据给浏览器
try:
f = open("./html" + file_name, "rb")
except:
response = "HTTP/1.1 404 NOT FOUND\r\n"
response += "Content-Type:text/html;charset=utf-8\r\n"
response += "\r\n"
response += "<h1>404 not found <br> 没有发现所请求资源</h1>"
response += str(time.strftime('%Y-%m-%d %H:%M:%S', time.localtime(time.time())))
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准备发送给浏览器的数据 ---body
# 将response header发送给浏览器
new_socket.send(response.encode("utf-8"))
# 将response body发送给浏览器
new_socket.send(html_content)
# 关闭套接字
new_socket.close()
def main():
"""用来完成整体的控制"""
# 1.创建套接字
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, client_addr = tcp_server_socket.accept()
print(client_addr)
# 5.为这个客户端服务
service_client(new_socket)
# 关闭监听套接字
tcp_server_socket.close()
if __name__ == '__main__':
main()
来源:https://www.py.cn/jishu/jichu/34528.html


猜你喜欢
- 本文实例为大家分享了微信小程序自定义支持图片的弹窗,供大家参考,具体内容如下为index.wxml添加如下图代码: (微信小程序 - can
- 首先,把这个“功能”包含到页首:<!--#include virtual="/readini/inifile.in
- 【摘要】 性能 首先,FCKEDITOR的性能是非常好的,用户只需很少的时间就可以载入FCKEDITOR所需文件.对于其他在线编辑器来说,这
- 一台服务器上开启了3个mysql实例进程,占用不同的端口 3306、3307、3308原理说明:通过自动发现规则来获取MySQL实例的端口,
- 第一种import win32clipboardimport time#速度快 容易出错class niubi(): def lihai(s
- 在默认情况下,MySQL搜索不区分大小写(但某些字符集始终区分大小写,如czech)。这意味着,如果你使用col_name LIKE
- librosa是处理音频库里的opencv,使用python脚本研究音频,先安装三方库librosa。如下通过清华镜像源安装librosa;
- 这里分享一些轨迹聚类的基本方法,涉及轨迹距离的定义、kmeans聚类应用。需要使用的python库如下import pandas as pd
- 问题Jupyter Notebook可以说是非常好用的小工具,但是不经过配置只能够在本机访问笔者参阅了文档对jupyter notebook
- 前言本文目的:根据本人的习惯与理解,用最简洁的表述,介绍爬虫的定义、组成部分、爬取流程,并讲解示例代码。基础爬虫的定义:定向抓取互联网内容(
- 1、如果同时从同一个客户端插入很多行,使用含多个 VALUE的INSERT语句同时插入几行。这比使用单行INSERT语句快(在某些情况下快几
- if(document.mylist.length != "undefined" ) {} 这个用法有误. 正确的是 i
- 一、Mysql使用limit分页select * from stu limit m, n; //m = (startPage-1)*page
- 在循环对象和函数对象中,我们了解了循环器(iterator)的功能。循环器是对象的容器,包含有多个对象。通过调用循环器的next()方法 (
- 在这篇文章里,我们会聊一聊为什么 Python 决定不支持 switch 语句。为什么想要聊这个话题呢?主要是因为 switch 在其它语言
- 本文实例讲述了Python从list类型、range()序列简单认识类(class)。分享给大家供大家参考,具体如下:list类型定义:it
- 前面也讲过一次phar文件上传的东西,但是那都是过滤比较低,仅仅过滤了后缀。知道今天看到了一篇好的文章如果过滤了phar这个伪造协议的话,那
- 前言本文主要分享一个python代码,可以将多个视频中的音频转化为相同采样率的视频。对视频格式的校验没有做,也不是很关键。环境依赖ffmpe
- 动态加载JavaScript文件和CSS资源为Web前端开发提供了巨大的灵活性,同时也实现了lazy load和按需加载,相比XMLHttp
- 本文主要向大家分享了Python编程中通过Django模块实现用户注册以及邮箱验证功能的简单介绍及代码实现,具体如下。用户注册:类似于用户登