IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 系统运维 -> python:简单实现web服务器 -> 正文阅读

[系统运维]python:简单实现web服务器

编写功能模块 http.py

import threading
import time
from socket import *
from re import match

# s是否匹配 正则表达式rex
def like(s,rex):
    try:
        return s==match(rex,s).group()
    except:
        return False


#http请求
class Request:
    def __init__(self,sock:socket):
        self.sock=sock
        bys=b''
        s=0
        while 1:
            if s==4:
                break
            b=self.readOne()
            if b==None:
                break
            bys+=b
            if s==0 and b==b'\r':
                s+=1
            elif s==1 and b==b'\n':
                s+=1
            elif s==2 and b==b'\r':
                s+=1
            elif s==3 and b==b'\n':
                s+=1
            else:
                s=0
        #获取请求头
        self.head=bys.decode()
        L=self.head.split("\r\n")
        U=L[1:-2]
        #请求 方法
        self.method,self.uri,self.proto=L[0].split(" ")
        # 把请求头包装为字典
        self.map={}
        for i in U:
            k,v=i.split(": ")
            self.map[k]=v
    #读一个字节
    def readOne(self):
        b=self.sock.recv(1)
        if b==b'':
            return None
        return b

#http响应
class Response:
    def __init__(self,sock:socket,code="utf-8"):
        self.sock=sock
        self.head=""
        self.status=200
        self.code=code
    #增加响应头
    def addHead(self,k,v):
        self.head+=k+": "+v+"\r\n"
    #发送响应头
    def sendHead(self):
        h="HTTP/1.1 "+str(self.status)+"\r\n"+self.head+"\r\n"
        self.sock.send(h.encode())
    # 响应字节流
    def write(self,bys):
        self.sock.send(bys)
    # 响应字符串
    def print(self,msg:str):
        self.sock.send(msg.encode(self.code))


class Server(socket):
    def __init__(self,ip="127.0.0.1",port=7000,lis=12) -> None:
        super().__init__(AF_INET,SOCK_STREAM)
        self.bind((ip,port))
        self.listen(lis)


#服务器
class Servlet(Server):
    def __init__(self, ip="127.0.0.1", port=7000, lis=12) -> None:
        super().__init__(ip, port, lis)
        self.map={}
        self.dir={}
        self.code="utf-8"
    #增加响应方法
    def addFunction(self,urip,func):
        self.map[urip]=func
    #增加静态资源根目录
    def addPageDir(self,uri,path):
        self.dir[uri]=path
    #响应页面  path是本机的文件地址
    def ResPage(self,res:Response,path):
        file=open(path,"rb")
        res.sendHead()
        res.write(file.read())
        file.close()
    #处理一个请求
    def Handle(self,sock:socket):
        req=Request(sock)
        res=Response(sock,self.code)
        uri=req.uri
        for k in self.map:
            if like(uri,k):
                func=self.map[k]
                func(req,res)
                sock.close()
                return
        for k in self.dir:
            v=self.dir[k]
            l=len(k)
            pre=uri[:l]
            print(k,pre)
            if k==pre:
                path=v+uri[l:]
                self.ResPage(res,path)
                sock.close()
                return
    #启动
    def run(self):
        while 1:
            sock,_=self.accept()
            th=threading.Thread(target=self.Handle,args=(sock,))
            th.start()

?

编写测试模块 test.py

import time
from http import *

def func(req:Request,res:Response):
    res.code="gbk"
    res.sendHead()
    uri=req.uri
    t=time.localtime(time.time())
    msg="<h1>现在是</h1>"+str(t.tm_hour)+"点 "+str(t.tm_min)+"分 "+str(t.tm_sec)+"秒 <h1>你的uri="+uri+"</h1>"
    res.print(msg)

servlet=Servlet()
servlet.addFunction("/f/.*",func)
servlet.addPageDir("/page","f:/pycode/http/page")
servlet.run()

在 目录?f:/pycode/http/page 下编辑 index.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
<h1>Hello Python</h1>
</body>
</html>

测试效果

?

?

  系统运维 最新文章
配置小型公司网络WLAN基本业务(AC通过三层
如何在交付运维过程中建立风险底线意识,提
快速传输大文件,怎么通过网络传大文件给对
从游戏服务端角度分析移动同步(状态同步)
MySQL使用MyCat实现分库分表
如何用DWDM射频光纤技术实现200公里外的站点
国内顺畅下载k8s.gcr.io的镜像
自动化测试appium
ctfshow ssrf
Linux操作系统学习之实用指令(Centos7/8均
上一篇文章      下一篇文章      查看所有文章
加:2022-03-21 21:35:42  更:2022-03-21 21:38:57 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/16 0:51:28-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码