• 自定义socket 模拟B/S服务端


    通过什么实现连接?

    • socket 套接字 位于应用层和传输层之间的虚拟层 一组接口进连接

    B/S 客户端与服务端交互过程

    socket server端 python代码 (静态html反馈)

        """ 
        根据URL中不同的路径返回不同的内容--函数进阶版 
        返回独立的HTML页面 
        """  
          
        import socket  
          
        sk = socket.socket()  
        sk.bind(("127.0.0.1", 8080))  # 绑定IP和端口  
        sk.listen()  # 监听  
          
          
        # 将返回不同的内容部分封装成不同的函数  
        def index(url):  
            # 读取index.html页面的内容  
            with open("index.html", "r", encoding="utf8") as f:  
                s = f.read()  
            # 返回字节数据  
            return bytes(s, encoding="utf8")  
          
          
        def home(url):  
            with open("home.html", "r", encoding="utf8") as f:  
                s = f.read()  
            return bytes(s, encoding="utf8")  
          
          
        # 定义一个url和实际要执行的函数的对应关系  
        list1 = [  
            ("/index/", index),  
            ("/home/", home),  
        ]  
          
        while True:  
            # 等待连接  
            conn, add = sk.accept()  
            data = conn.recv(8096)  # 接收客户端发来的消息  
            # 从data中取到路径  
            data = str(data, encoding="utf8")  # 把收到的字节类型的数据转换成字符串  
            # 按
    分割  
            data1 = data.split("
    ")[0]  
            url = data1.split()[1]  # url是我们从浏览器发过来的消息中分离出的访问路径  
            conn.send(b'HTTP/1.1 200 OK
    
    ')  # 因为要遵循HTTP协议,所以回复的消息也要加状态行  
            # 根据不同的路径返回不同内容  
            func = None  # 定义一个保存将要执行的函数名的变量  
            for item in list1:  
                if item[0] == url:  
                    func = item[1]  
                    break  
            if func:  
                response = func(url)  
            else:  
                response = b"404 not found!"  
          
            # 返回具体的响应消息  
            conn.send(response)  
            conn.close()  
    
    • 提供响应的index页面 html代码
    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <meta http-equiv="x-ua-compatible" content="IE=edge">
        <meta name="viewport" content="width=device-width, initial-scale=1">
        <title>index</title>
    </head>
    <body>
    <div>这是index页面</div>
    </body>
    </html>
    
    • 提供响应的home页面 html代码
    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <meta http-equiv="x-ua-compatible" content="IE=edge">
        <meta name="viewport" content="width=device-width, initial-scale=1">
        <title>home</title>
    </head>
    <body>
    <div>这是home页面</div>
    </body>
    </html>
    
    • 浏览器访问 index页面

    • 浏览器访问 home页面

    • 输入无效页面结果

    • 网页能够正常显示,但是都是静态的。页面的内容都不会变化

    socket server端 python代码 (动态html反馈)

    #我们改一下代码,模拟一下动态网站。选择使用字符串替换来实现这个需求。(这里使用时间戳来模拟动态的数据)
    
        """ 
        根据URL中不同的路径返回不同的内容--函数进阶版 
        返回独立的HTML页面 
        """  
          
        import socket  
          
        sk = socket.socket()  
        sk.bind(("127.0.0.1", 8080))  # 绑定IP和端口  
        sk.listen()  # 监听  
          
          
        # 将返回不同的内容部分封装成不同的函数  
        def index(url):  
            # 读取index.html页面的内容  
            with open("index.html", "r", encoding="utf8") as f:  
                s = f.read()  
            # 返回字节数据  
            return bytes(s, encoding="utf8")  
          
          
        def home(url):  
            with open("home.html", "r", encoding="utf8") as f:  
                s = f.read()  
            return bytes(s, encoding="utf8")  
          
          
        def timer(url):  
            import time  
            with open("time.html", "r", encoding="utf8") as f:  
                s = f.read()  
                s = s.replace('@@time@@', time.strftime("%Y-%m-%d %H:%M:%S"))  
            return bytes(s, encoding="utf8")  
          
          
        # 定义一个url和实际要执行的函数的对应关系  
        list1 = [  
            ("/index/", index),  
            ("/home/", home),  
            ("/time/", timer),  
        ]  
          
        while True:  
            # 等待连接  
            conn, add = sk.accept()  
            data = conn.recv(8096)  # 接收客户端发来的消息  
            # 从data中取到路径  
            data = str(data, encoding="utf8")  # 把收到的字节类型的数据转换成字符串  
            # 按
    分割  
            data1 = data.split("
    ")[0]  
            url = data1.split()[1]  # url是我们从浏览器发过来的消息中分离出的访问路径  
            conn.send(b'HTTP/1.1 200 OK
    
    ')  # 因为要遵循HTTP协议,所以回复的消息也要加状态行  
            # 根据不同的路径返回不同内容  
            func = None  # 定义一个保存将要执行的函数名的变量  
            for item in list1:  
                if item[0] == url:  
                    func = item[1]  
                    break  
            if func:  
                response = func(url)  
            else:  
                response = b"404 not found!"  
          
            # 返回具体的响应消息  
            conn.send(response)  
            conn.close()  
    
    • 提供响应的time页面 html代码
    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>time</title>
    </head>
    <body>
        <div>@@time@@</div>  <!--@@来标识要替换的元素-->
    </body>
    </html>
    
    • 执行效果 (刷新三次,时间是动态的)

    小结 :

    这是我们用socket模拟,基于BS框架下的 server端与browser端的交互,对于真实开发中的python web程序来说,
    一般会分为两部分:服务器程序和应用程序。服务器程序负责对socket服务端进行封装,并在请求到来时,
    对请求的各种数据进行整理。应用程序则负责具体的逻辑处理。为了方便应用程序的开发,就出现了众多的Web框架,
    例如:Django、Flask、web.py 等。不同的框架有不同的开发方式,但是无论如何,开发出的应用程序都要和服务器程序配合,
    才能为用户提供服务。
    
    作 者:郭楷丰
    声援博主:如果您觉得文章对您有帮助,可以点击文章右下角 推荐一下。您的鼓励是博主的最大动力!
    自 勉:生活,需要追求;梦想,需要坚持;生命,需要珍惜;但人生的路上,更需要坚强。带着感恩的心启程,学会爱,爱父母,爱自己,爱朋友,爱他人。
  • 相关阅读:
    luogu 3388 【模板】割点(割顶)
    bzoj 3624 免费道路
    bzoj 1179 Atm
    bzoj 2428 均分数据
    luogu 4429 染色
    luogu 4427 求和
    luogu 1121 环状最大两段子段和
    hdu 4777 Queue
    hdu 5492 Find a path
    hdu 5441 Travel
  • 原文地址:https://www.cnblogs.com/guokaifeng/p/11005817.html
Copyright © 2020-2023  润新知