zoukankan      html  css  js  c++  java
  • 返回用户指定页面的web服务器

    import socket
    import re
    import os
    
    def handle_client(socket_con):
        """
         接收来自客户端的请求,并接收请求报文,解析,返回
        """
        # 1、服务器接收客户端的请求报文
        request = socket_con.recv(4096).decode()
        # 以行切割请求报文为列表
        res = request.split('
    ')
        # 取第一位(请求行):GET / HTTP/1.1,并用正则切割GET / HTTP/1.1,取出路径位置
        path = re.match('w+s(S+)',res[0])
        path = path.group(1)
        # 判断路径长度,大于一则拼接出路径,小于等于一则显示首页
        if len(path) > 1:
            # 路径取出,开始拼接资源路径(绝对路径自己填写)
            path = '# 文件夹绝对路径' + path
            print(path)
        else:
            # 显示首页代码
            response_line = 'HTTP/1.1 200 OK
    '
            response_head = 'Content-Type:text/html;charset=utf-8
    '
            response_body = '''
                <html>
                <head>
                <title>首页</title>
                <style>
                body {
                         35em;
                        margin: 0 auto;
                        font-family: Tahoma, Verdana, Arial, sans-serif;
                     }
                </style>
                </head>
                <body>
                <h1>首页</h1>
                <p>欢迎来到首页</p>
                <p><em>感谢你的使用</em></p>
                </body>
                </html>'''
            response = response_line + response_head + '
    ' + response_body
            socket_con.send(response.encode())
            socket_con.close()
        # 路径大于一并取出之后判断资源是否存在
        if not os.path.exists(path):
            # 资源不存在则显示资源不存在界面
            response_line = 'HTTP/1.1 404 NOT FOUND
    '
            response_head = 'Content-Type:text/html;charset=utf-8
    '
            response_body = '''
                <html>
                <head>
                <title>错误</title>
                <style>
                    body {
                         35em;
                        margin: 0 auto;
                        font-family: Tahoma, Verdana, Arial, sans-serif;
                    }
                </style>
                </head>
                <body>
                <h1>你请求的资源不存在!</h1>
                <p>如果你想访问一个资源,请输入正确的资源路径</p>
                <p><em>感谢你的使用</em></p>
                </body>
                </html>'''
            response = response_line + response_head + '
    ' + response_body
            socket_con.send(response.encode())
            socket_con.close()
            return
        else:
            # 资源存在以后判断是否是文件,是文件则直接读取
            if os.path.isfile(path):
                response_line = 'HTTP/1.1 200 OK
    '
                response_head = 'Server:skylark 2.0
    '
                response_head += 'Content-Type:*/*;charset:utf-8
    '
                f = open(path, 'rb')
                response_body = f.read()
                response = response_line.encode() + response_head.encode() + '
    '.encode() + response_body
                socket_con.send(response)
                socket_con.close()
                return
            else:
                if path.endswith('/'):
                     # 如果是文件夹
                     # 判断文件夹下是否有默认文件,如果有则返回,如果没有则判断服务器是否开启了目录浏览
                     # 默认文件:index.html  default.html
                     # 是否可以访问默认文件开关,True 开 ,False 关
                     default_document = False
                     if default_document:
                         # 判断用户访问的文件夹下是否有index.html 或者 default.html
                         if os.path.exists(path + 'index.html'):
                             response_line = 'HTTP/1.1 200 OK
    '
                             response_head = 'Server:skylark 2.0
    '
                             response_head += 'Content-Type:*/*;charset:utf-8
    '
                             f = open(path + 'index.html', 'rb')
                             response_body = f.read()
                             response = response_line.encode() + response_head.encode() + '
    '.encode() + response_body
                             socket_con.send(response)
                             socket_con.close()
                             return
                         elif os.path.exists(path + 'default.html'):
                             response_line = 'HTTP/1.1 200 OK
    '
                             response_head = 'Server:skylark 2.0
    '
                             response_head += 'Content-Type:*/*;charset:utf-8
    '
                             f = open(path + 'default.html', 'rb')
                             response_body = f.read()
                             response = response_line.encode() + response_head.encode() + '
    '.encode() + response_body
                             socket_con.send(response)
                             socket_con.close()
                             return
                         else:
                             # 如果没有上述两个页面,则可以返回404错误,或者302重定向
                             response_line = "HTTP/1.1 404 Not Found
    "
                             response_head = "Server:skylark 2.0
    "
                             response_body = "index.html or default.html is not exist!!!"
                             response = response_line + response_head + "
    " + response_body
                             socket_con.send(response.encode())
                             socket_con.close()
                    # 不能访问默认文件情况下,判断服务器是否开启了目录浏览
                     else:
                         dir_browsing = True
                         if dir_browsing:
                             # 把用户请求的文件夹中所有的文件和文件夹以目录的形式返回到页面中
                             # 获取用户请求的文件夹
                             list_names = os.listdir(path)
                             response_line = 'HTTP/1.1 200 OK
    '
                             response_head = 'Server:skylark 2.0
    '
                             # 动态的拼接页面,将目录中的文件或者文件夹的名称以HTML页面的方式返回给浏览器
                             response_body = '<html><head><body><ul>'
                             for item in list_names:
                                 response_body += "<li><a href = '#'>" + item + "</a></li>"
                             response_body += '</ul></body></head></html>'
                             response = response_line + response_head + "
    " + response_body
                             socket_con.send(response.encode())
                             socket_con.close()
                             return
                else:
                    # 用户请求的路径没有斜线
                    # 重定向到+斜线的目录下,并显示重定向以后的路径(此处可以增加有斜线目录处理方式也就是上面的方法)
                    response_line = 'HTTP/1.1 302 Found
    '
                    response_head = 'Server:skylark 2.0
    '
                    response_head += 'Content-Type:text/html;charset=utf-8
    '
                    response_body = '重定向' + path + '/'
                    response = response_line + response_head + '
    ' + response_body
                    socket_con.send(response.encode())
                    socket_con.close()
    
    
    def main():
        # 1、服务器创建负责监听的socket
        socket_watch = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
        # 2、设置地址重用
        socket_watch.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
        # 3、绑定监听的端口
        socket_watch.bind(("",8888))
        # 4、设置监听队列
        socket_watch.listen(128)
        # 5、通过循环,不停的接收来自客户端的连接请求
        while True:
            socket_con,con_adds = socket_watch.accept()
            # 注意将con_adds转成字符串
            print("客户端:%s连接成功!!!" % str(con_adds))
            # 接收来自客户端的请求,并接收请求报文,解析,返回
            handle_client(socket_con)
    
    if __name__ == '__main__':
        main()
    

      

  • 相关阅读:
    说说 C# 9 新特性的实际运用
    如何在Linux上使用VIM进行.Net Core开发
    写给程序员的机器学习入门 ---- 系列文章
    Java多线程Thread/Runnable/Callable之间的区别
    多种方式C#实现生成(条码/二维码)
    二维码(QR code)基本知识
    IntelliJ IDEA基本配置
    nps是一款轻量级、高性能、功能强大的内网穿透代理服务器。目前支持tcp、udp流量转发,可支持任何tcp、udp上层协议,还支持内网http代理、内网socks5代理、p2p等
    HTTP隧道ABPTTS——加密型的http隧道,todo自己搭建一个玩玩
    Neo-reGeorg ——目前比较好用的http隧道工具,支持本地建立 socks5 代理
  • 原文地址:https://www.cnblogs.com/wf-skylark/p/9027128.html
Copyright © 2011-2022 走看看