• 在线客服

  • 扫描二维码
    下载博学谷APP

  • 扫描二维码
    关注博学谷微信公众号

  • 意见反馈

原创 命令行启动动态绑定端口号静态Web服务器代码怎么写?

发布时间:2021-12-24 10:43:31 浏览 1976 来源:博学谷 作者:小谷

    命令行启动动态绑定端口号静态Web服务器代码怎么写?首先需要获取执行python程序的终端命令行参数,然后判断参数的类型,设置端口号必须是整型,最后给Web服务器类的初始化方法添加一个端口号参数,用于绑定端口号。

    一、命令行启动动态绑定端口号静态Web服务器学习目标是什么?

    能够写出获取终端命令行参数动态绑定端口号的web服务器程序

    二、开发命令行启动动态绑定端口号的静态web服务器实现步骤:

    (1)获取执行python程序的终端命令行参数

    (2)判断参数的类型,设置端口号必须是整型

    (3)给Web服务器类的初始化方法添加一个端口号参数,用于绑定端口号

    三、静态Web服务器命令行启动动态绑定端口号的示例代码

    import socket
    import threading
    import sys
    
    
    # 定义web服务器类
    class HttpWebServer(object):
        def __init__(self, port):
            # 创建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(("", port))
            # 设置监听
            tcp_server_socket.listen(128)
            # 保存创建成功的服务器套接字
            self.tcp_server_socket = tcp_server_socket
    
        # 处理客户端的请求
        @staticmethod
        def handle_client_request(new_socket):
            # 代码执行到此,说明连接建立成功
            recv_client_data = new_socket.recv(4096)
            if len(recv_client_data) == 0:
                print("关闭浏览器了")
                new_socket.close()
                return
    
            # 对二进制数据进行解码
            recv_client_content = recv_client_data.decode("utf-8")
            print(recv_client_content)
            # 根据指定字符串进行分割, 最大分割次数指定2
            request_list = recv_client_content.split(" ", maxsplit=2)
    
            # 获取请求资源路径
            request_path = request_list[1]
            print(request_path)
    
            # 判断请求的是否是根目录,如果条件成立,指定首页数据返回
            if request_path == "/":
                request_path = "/index.html"
    
            try:
                # 动态打开指定文件
                with open("static" + request_path, "rb") as file:
                    # 读取文件数据
                    file_data = file.read()
            except Exception as e:
                # 请求资源不存在,返回404数据
                # 响应行
                response_line = "HTTP/1.1 404 Not Found\r\n"
                # 响应头
                response_header = "Server: PWS1.0\r\n"
                with open("static/error.html", "rb") as file:
                    file_data = file.read()
                # 响应体
                response_body = file_data
    
                # 拼接响应报文
                response_data = (response_line + response_header + "\r\n").encode("utf-8") + response_body
                # 发送数据
                new_socket.send(response_data)
            else:
                # 响应行
                response_line = "HTTP/1.1 200 OK\r\n"
                # 响应头
                response_header = "Server: PWS1.0\r\n"
    
                # 响应体
                response_body = file_data
    
                # 拼接响应报文
                response_data = (response_line + response_header + "\r\n").encode("utf-8") + response_body
                # 发送数据
                new_socket.send(response_data)
            finally:
                # 关闭服务与客户端的套接字
                new_socket.close()
    
        # 启动web服务器进行工作
        def start(self):
            while True:
                # 等待接受客户端的连接请求
                new_socket, ip_port = self.tcp_server_socket.accept()
                # 当客户端和服务器建立连接程,创建子线程
                sub_thread = threading.Thread(target=self.handle_client_request, args=(new_socket,))
                # 设置守护主线程
                sub_thread.setDaemon(True)
                # 启动子线程执行对应的任务
                sub_thread.start()
    
    
    # 程序入口函数
    def main():
    
        print(sys.argv)
        # 判断命令行参数是否等于2,
        if len(sys.argv) != 2:
            print("执行命令如下: python3 xxx.py 8000")
            return
    
        # 判断字符串是否都是数字组成
        if not sys.argv[1].isdigit():
            print("执行命令如下: python3 xxx.py 8000")
            return
    
        # 获取终端命令行参数
        port = int(sys.argv[1])
        # 创建web服务器对象
        web_server = HttpWebServer(port)
        # 启动web服务器进行工作
        web_server.start()
    
    
    if __name__ == '__main__':
        main()

    四、命令行启动动态绑定端口号静态Web服务器小结

    (1)获取执行python程序的终端命令行参数

     sys.argv

    (2)判断参数的类型,设置端口号必须是整型

     if not sys.argv[1].isdigit():
         print("启动命令如下: python3 xxx.py 9090")
         return
     port = int(sys.argv[1])

    (3)给Web服务器类的初始化方法添加一个端口号参数,用于绑定端口号

     def __init__(self, port):
         self.tcp_server_socket.bind((“”, port))

    申请免费试学名额    

在职想转行提升,担心学不会?根据个人情况规划学习路线,闯关式自适应学习模式保证学习效果
讲师一对一辅导,在线答疑解惑,指导就业!

上一篇: 面向对象开发静态Web服务器代码怎么写? 下一篇: JavaScript的作用及使用方法基础知识分享

相关推荐 更多

热门文章

  • 前端是什么
  • 前端开发的工作职责
  • 前端开发需要会什么?先掌握这三大核心关键技术
  • 前端开发的工作方向有哪些?
  • 简历加分-4步写出HR想要的简历
  • 程序员如何突击面试?两大招带你拿下面试官
  • 程序员面试技巧
  • 架构师的厉害之处竟然是这……
  • 架构师书籍推荐
  • 懂了这些,才能成为架构师
  • 查看更多

扫描二维码,了解更多信息

博学谷二维码