文章目录
- 需求提出
- 需求背景
- 具体需求
- 需求图示
- 需求分析
- 技术分解
- 需求实现
- socket
- socket client
- socket server
- socket result
- Flask
- Flask+socket client
- socket server
- result
- 改进版
- Flask
- socket client
- socket server
- Flask + HTML
- 改进版result
有需求才有动力!
需求提出
需求背景
公司的每个项目都会产生很多BUG,对应很多LOG,为了快速打开LOG目录进行查看,产生了一个需求
具体需求
网页端超链接或者按钮,点击之后自动打开对应BUG的LOG文件资源管理器
需求图示
需求分析
技术分解
- 首先要有超链接或者按钮供点击,这里涉及到HTML和Web部署
– 对于Python来说就是:Flask+HTML - 其次是数据传输,客户端要知道超链接的内容,需要打开哪个文件夹
– 这里可以使用socket 进行传输
– 其实对于IE浏览器有现成的功能,Chrome有类似的插件,但是支持都不好,这里不再赘述 - 最后是知道文件目录,要打开文件夹
– Python有现成的库进行使用:import os
那么要实现这个需求,就是使用到:HTML+Flask+socket+os
其中最关键的就是socket,以下逐步实现
需求实现
socket
Socket又称"套接字",应用程序通常通过"套接字"向网络发出请求或者应答网络请求,使主机间或者一台计算机上的进程间可以通讯。
socket 主要就是为了通信用的,自然分为client端和server端,可以相互发送数据。server端是可以一直监听client端的消息,做出响应。
socket client
#!/usr/bin/python
# -*- coding: UTF-8 -*-
#file name:basic_socket_client.py
import socket # 导入 socket 模块
s = socket.socket() # 创建 socket 对象
port = 65432 # 设置端口号
server_ip = socket.gethostbyname(socket.getfqdn(socket.gethostname())) #server 端IP地址,此处是本机地址
s.connect((server_ip, port))#连接
dir = 'C:\\Users\\wq\\Downloads\\python'
dir = bytes(dir,encoding='utf-8')
s.send(dir) #向server端发送数据
s.close() #关闭socket
socket server
#!/usr/bin/python
# -*- coding: UTF-8 -*-
#file name:basic_socket_server.py
import socket # 导入 socket 模块
s = socket.socket() # 创建 socket 对象
host = socket.gethostbyname(socket.getfqdn(socket.gethostname())) # 获取本地主机名
print(host)
port = 65432 # 设置端口
s.bind((host, port)) # 绑定端口
s.listen() # 等待客户端连接
while True:
conn,addr = s.accept() # 建立客户端连接
print("连接地址:", addr)
#c.send('欢迎访问菜鸟教程!')
data=conn.recv(1024)
data = str(data,encoding="utf-8")
print("received dir:",data)
s.close() # 关闭连接
socket result
运行socket,首先需要运行server端,保持监听状态,然后运行client端,就可以看到结果了,此处仅展示client向server发送数据的场景,如下
Flask
关于Flask Web框架的简单实用,在上篇文章做了简单介绍,对于本次需求的实现足矣。
上文知道了socket的简单使用,那要实现需求,需要将socket放到Flask里面使用,这样架到服务器上就能访问并进行通信了。
Flask+socket client
#!/usr/bin/python
# -*- coding: UTF-8 -*-
#file name:flask_open_dir.py
from flask import Flask #need install flask like:pip install flask
from flask import request
import socket # 导入 socket 模块
app = Flask(__name__)
@app.route('/open_dir') #url 路由地址,参考http://127.0.0.1:5000/python_web
def open_dir():
dir = request.args.get('dir') #获取url 参数
client_ip = request.remote_addr #获取客户端访问IP
print('client ip :',client_ip)
print('received dir:',dir)
s = socket.socket() # 创建 socket 对象
port = 65432 # 设置端口号,这个端口要与Flask所使用的的端口保持一致
s.connect((client_ip, port))
data = bytes(dir,encoding='utf-8')
s.send(data)
s.close()
return '200'
if __name__ == '__main__':
ip = socket.gethostbyname(socket.getfqdn(socket.gethostname())) # 获取本地主机名
app.run(debug=True,host=ip,port='65432')#指定IP,端口
socket server
server不需要Flask,在用户PC上保证一直运行就可以
#!/usr/bin/python
# -*- coding: UTF-8 -*-
#file name:open_dir_server.py
#本文件应该部署在客户端,保持一直运行,监听Flask服务器端发送的数据
import os
import socket # 导入 socket 模块
s = socket.socket() # 创建 socket 对象
host = socket.gethostbyname(socket.getfqdn(socket.gethostname())) # 获取本地主机名
print(host)
port = 65432 # 设置端口
s.bind((host, port)) # 绑定端口
s.listen() # 等待客户端连接
while True:
conn,addr = s.accept() # 建立客户端连接
print("连接地址:", addr)
#c.send('欢迎访问菜鸟教程!')
data=conn.recv(1024)
data = str(data,encoding="utf-8")
print("received dir:",data)
if os.path.exists(data):
print('dir exist !')
os.system('explorer.exe %s' % data) #一行代码就可以实现打开文件资源管理器
else:
print('dir not exist !')
s.close() # 关闭连接
result
这里注意一个问题,socket使用的端口需要和Flask使用的端口保持一致,这就存在端口占用冲突的问题,所以以下的代码在本地无法使用,需要在局域网进行调试(局域网中碰到一个问题,socket server中一直收不到client端发的数据,可能跟Flask有关,才疏学浅暂时没有找到根源)。
改进版
Flask
#!/usr/bin/python
# -*- coding: UTF-8 -*-
#file name:flask_open_system.py
from flask import Flask,render_template #need install flask like:pip install flask
from flask import request
import socket # 导入 socket 模块
import os
#app实例
app = Flask(__name__)
@app.route('/') #url 路由地址
def index():
#此处使用Flask的tempplate特性,展示HTML网页
return render_template('index.html')
@app.route('/open_dir') #url 路由地址,参考http://127.0.0.1:5000/
def open_dir():
#获取url 参数
dir = request.args.get('dir')
print(dir)
#获取客户端IP,因为只有一台电脑所以这个IP也是本机IP地址
#正常在局域网下面,就是访问者的IP地址
client_ip = request.remote_addr
print(client_ip)
#客户端脚本
client_py_file = '"C:\\Users\\wq\\PycharmProjects\\PythonWebFlask\\FlaskWeb\\open_dir_client.py"'
#dir = 'C:\\Users\\wq\\Downloads\\python'
#既然我们最初测试basic socket可以使用,那么类似利用os的方式也就可以正常使用,此时我们可以任意指定其他端口
#将ip地址,dir参数传递给client端进行发送
os.system('python.exe %s %s %s' % (client_py_file,client_ip,dir))
return '已经打开文件夹!'
if __name__ == '__main__':
#本机IP,在本机IP上部署Flask
ip = socket.gethostbyname(socket.getfqdn(socket.gethostname())) # 获取本地主机名
app.run(debug=True,host=ip,port='65431')
#app.run(debug=True,port='65431')
socket client
#!/usr/bin/python
# -*- coding: UTF-8 -*-
#file name:open_dir_client.py
#和Flask放在同一端,服务器端,作为socket client发送数据给socket server
import socket # 导入 socket 模块
import sys
s = socket.socket() # 创建 socket 对象
port = 65432 # 设置端口号
server_ip = sys.argv[1] #获取参数
#dir = 'C:\\Users\\wq\\Downloads\\python'
dir = sys.argv[2]
s.connect((server_ip, port))
data = bytes(dir,encoding='utf-8')
s.send(data)
s.close()
socket server
file name:open_dir_server.py,参考上文
Flask + HTML
#!/usr/bin/python
# -*- coding: UTF-8 -*-
#file name:flask_open_system.py,在此文件下添加代码
@app.route('/') #url 路由地址
def index():
#此处使用Flask的tempplate特性,展示HTML网页
return render_template('index.html')
改进版result