07-使用终端中启动Web服务器
目标¶
能够通过终端
指定端口并启动`Web服务器
1. 功能分析¶
1、在终端中启动Web服务器
2、启动格式:python3 WebServer.py 8080
其中:WebServer.py 为web服务器文件
8080 为Web服务器对外服务端口
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()