静态Web服务器-命令行启动动态绑定端口号

Posted 黑马程序员官方

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了静态Web服务器-命令行启动动态绑定端口号相关的知识,希望对你有一定的参考价值。

学习目标

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

1. 开发命令行启动动态绑定端口号的静态web服务器

实现步骤:

  1. 获取执行python程序的终端命令行参数
  2. 判断参数的类型,设置端口号必须是整型
  3. 给Web服务器类的初始化方法添加一个端口号参数,用于绑定端口号

2. 静态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()

3. 小结

  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))

 


Python零基础笔记汇总:

Python解释器详解

注释作用及分类运算符总结定义变量与数据类型
if判断与循环总结理解面向对象集合操作方法列表的常用操作
Python异常元组应用及操作

Python爬虫笔记篇(含项目实战案例):

代理池概述及开发环境代理池的设计实现代理池思路定义代理IP的数据模型类
实现代理池工具模块实现代理池的校验模块实现代理池的数据库模块实现代理池的爬虫模块
实现代理池的检测模块

实现代理池的API模块

Bilibili模拟登陆(滑动验证码)

Python Web篇笔记(更新中……):

Part 01—Linux基础命令
操作系统与虚拟机软件了解Ubuntu操作系统Linux查看、切换目录命令绝对路径和相对路径
 创建、删除、复制、移动文件及目录命令 ls命令选项mkdir和rm命令选项 cp和mv命令选项
Part 02—Linux高级命令
重定向命令查看文件内容命令、链接命令文本搜索命令查找文件命令
压缩和解压缩命令文件权限命令获取管理员权限的相关命令用户相关操作
用户组相关操作远程登录、远程拷贝命令
静态Web服务器
搭建Python自带静态Web服务器静态Web服务器-返回固定页面数据静态Web服务器-返回指定页面数据静态Web服务器-多任务版
静态Web服务器-面向对象开发

2022年Python+大数据学习路线图,源码笔记,最优学习资源_黑马程序员官方的博客-CSDN博客任何学习过程都需要一个科学合理的学习路线,才能够有条不紊的完成我们的学习目标。Python+大数据所需学习的内容纷繁复杂,难度较大,所以今天特别为大家整理了一个全面的Python+大数据学习路线图,帮大家理清思路,攻破难关!文章目录前言第一阶段 大数据开发入门1.大数据数据开发基础mysql8.0从入门到精通第二阶段 大数据核心基础2022版大数据Hadoop入门教程第三阶段 千亿级数仓技术数据离线数据仓库,企业级在线教育项目实战(Hive数仓项目完整流程)第四阶段 PB内存计算1.pythohttps://blog.csdn.net/itcast_cn/article/details/1223065522022年人工智能学习路线图,清楚明确_黑马程序员官方的博客-CSDN博客_人工智能学习路线图众所周知,人工智能时代已经融入到我们的生活的当中,不论是图像识别还是语音识别的相关产品已经开始落地,就连国家都将人工智能设为了国家战略级发展规划,人工智能开发将会是是未来技术研究的前沿。下面特别给大家整理了人工智能的学习路线,希望大家都能有清楚的学习方向。文章目录第一阶段 人工智能开发入门1. 人工智能之python编程零基础入门2、4天快速入门Python数据挖掘第二阶段 机器学习核心技术第三阶段 NLP自然语言处理技术第四阶段 CV计算机视觉技术1.AI-OpenCV图像处理10小时零基础入门2https://blog.csdn.net/itcast_cn/article/details/122882407

详情大家可以关注Python专栏,努力为大家更新更多好内容 ↑ ↑ ↑  

以上是关于静态Web服务器-命令行启动动态绑定端口号的主要内容,如果未能解决你的问题,请参考以下文章

静态Web服务器-命令行启动动态绑定端口号Python解释器详解实现代理池的API模块

Python搭建本地静态Web服务器(多任务进阶版)

linux怎么配置不同的启动端

xmlrpc - 动态选择端口号

解决端口号占用问题:Web Server failed to start.Port 8002 was already in use.

解决端口号占用问题:Web Server failed to start.Port 8002 was already in use.