07-使用终端中启动Web服务器

目标

  • 能够通过终端指定端口并启动`Web服务器

1. 功能分析

1、在终端中启动Web服务器

2、启动格式:python3 WebServer.py 8080

其中:WebServer.py 为web服务器文件

8080 为Web服务器对外服务端口

image-20181025000532032

2. 实现思路

1、导入sys 模块

2、通过sys.argv 获取参数列表

3、判断列表长度是否为 2 ,如果不等于2 要给出提示,Web服务器启动失败

4、取出第二个参数,判断是否是一个数字,如果不是一个数组,则给出提示,Web服务器启动失败

5、接收启动参数 端口号

6、修改类构造方法,使用提供的端口号启动Web服务器

3. 准备工作

3.1 argv 的使用

argv 是argument variable参数变量的简写形式,一般在命令行调用的时候由系统传递给程序。这个变量其实是一个List列表,argv[0] 一般是被调用的脚本文件名或全路径,和操作系统有关。

sys.argv变量是一个字符串的列表。

sys.argv[] 是用来获取命令行参数的; sys.argv[0] 比如在CMD命令行输入 “python  test.py -help”,那么sys.argv[0]就代表“test.py”; sys.argv[0] 是命令名; sys.argv[1:] 是所有参数;

3.2 isdigit() 函数

Python isdigit()方法检测字符串是否只由数字组成。如果字符串只包含数字则返回 True 否则返回 False。

以下实例展示了isdigit()方法的实例:

str = "123456";  # Only digit in this string
print str.isdigit();

str = "this is string example....wow!!!";
print str.isdigit();

以上实例输出结果如下:

True
False

4. 代码实现

import socket
from application import app
import sys


class WebServer(object):
    """WebServer-Web服务器类"""

    # 定义初始化方法
    def __init__(self, port):
        # 1、创建套接字
        tcp_server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
        # 2、设置套接字属性(地址可以重用)
        tcp_server_socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, True)
        # 3、绑定端口(8080)
        tcp_server_socket.bind(("", port))
        # 4、开启监听,设置套接字由主动设置为被动
        tcp_server_socket.listen(128)

        self.tcp_server_socket = tcp_server_socket

    # 定义启动服务器方法
    def start(self):

        while True:
            # 5、接受客户端连接并拆包
            new_client_socket, ip_port = self.tcp_server_socket.accept()
            # 6、调用 request_handler() 处理请求
            self.request_handler(new_client_socket, ip_port)

    # 定义响应服务器方法
    def request_handler(self, new_client_socket, ip_port):
        """接受客户端请求并处理"""
        # 1、接受客户端请求报文
        request_data = new_client_socket.recv(1024)
        # 2、判断客户端是否已经下线
        if not request_data:
            print("客户端[%s]已经下线~" % str(ip_port))
            new_client_socket.close()
            return

        # 调用 app 模块的 application 方法处理请求
        response_data = app.application(request_data)

        # 4、发送请求报文
        new_client_socket.send(response_data)
        # 5、关闭连接
        new_client_socket.close()


def main():

    # 判断参数个数是否合法
    if len(sys.argv) != 2:
        print("启动失败,参数个数错误!正确格式:python xxx.py 8080")
        return

    # 判断端口是否是纯数字
    if not sys.argv[1].isdigit():
        print("启动失败,端口不是数字!")
        return

    # 保存端口
    port = int(sys.argv[1])

    """主入口方法"""
    # 1、创建对象
    ws = WebServer(port)

    # 2、启动服务器
    ws.start()


if __name__ == '__main__':
    main()