aardio 搭建Http服务器与Python客户端交互
By
jerryxjr1220
at 2022-02-16 • 1人收藏 • 3063人看过
aardio搭建Http服务器还是挺方便的,用aardio做前端,采用多线程启动服务器通过Http协议与python的后台程序实现交互,python在后端处理负责计算。aardio和python前后端或者终端都可以分离,只要能通过ip地址和端口号相互访问即可。
aardio服务器端:
import win.ui;
/*DSG{{*/
mainForm = win.form(text="aardio2py";right=959;bottom=591)
mainForm.add(
edit={cls="edit";left=45;top=80;right=911;bottom=487;edge=1;multiline=1;z=1}
)
/*}}*/
import thread;
//启动多线程启动Http服务器监听"127.0.0.1:16543"端口
thread.invoke( function(winform){
import wsock.tcp.simpleHttpServer;
server = wsock.tcp.simpleHttpServer("127.0.0.1", 16543);
winform.edit.print('Server is running...\r\n'++server.getUrl());
//设置Http服务器中可以访问的全局变量
server.threadGlobal = {
window = winform;
};
//设置默认访问网页
server.defalutDocument = "index.html";
//启动服务器
server.run( function(response,request,session){
import string;
window.edit.print( request.remoteAddr, request.path );
//非指定客户端拒绝访问
if request.headers["user-agent"] != "Py-App" {
response.error("Access Deny! 503 Error!")
}
/***
//响应图标反馈, Python requests 访问用不到
elseif request.path == "/favicon.ico" {
response.loadcode( "res/favicon.ico" )
}
***/
//业务逻辑响应
elseif request.path == "/" or request.path == "/index.html" {
response.loadcode( "/index.html" );
}
elseif string.startWith(request.path, "/senddata/") {
subpath = string.match(request.path, "/senddata/(.*)")
response.write(subpath)
}
});
}, mainForm)
mainForm.show();
return win.loopMessage();
python客户端,直接用requests的Session实现会话。
from requests.sessions import Session
ss = Session()
ss.headers = {"User-Agent": "Py-App"}
resp = ss.get("http://127.0.0.1:16543/senddata/12333")
print(resp.text)
print(ss.cookies)
客户端可以利用Cookies来存储必要身份信息
12 个回复 | 最后更新于 2022-02-18
2022-02-16
#4
其实主要就是为了实现界面UI和业务逻辑的分离,用aardio画界面太方便了,而且打个包很小,给到用户很方便。业务端要处理复杂任务,比如要跑神经网络,没有python的第三方库根本跑不了,打包的话巨大无比还不一定能打包成功。
2022-02-17
#8
回复#7 @jacen :
抽空研究了一下HTTP-JSON-RPC,它需要建立在HTTP服务器上,调用服务器接收到的request和response对象进行返回。
对原来的HTTP服务器做了修改:
//启动服务器
server.run( function(response,request,session){
import string;
window.edit.print( request.postData());
import web.rpc.jsonServer;
jserver = web.rpc.jsonServer();
jserver.hello = function(name){
/*
第一个返回值为客户端返回值(result),
第二个返回值为错误对象(error)
*/
if(!name) return null,-32602/*_JSONRPC_INVALID_PARAMS*/;
return "hello " + name;
}
jserver.rpc.run();
}); 同时,对Python客户端进行修改:
from requests.sessions import Session
import json
ss = Session()
resp = ss.post("http://127.0.0.1:16543", data=json.dumps({"id":"hello","jsonrpc":"2.0","method":"hello","params":["jacen"]}))
print(json.loads(resp.text)["result"])python客户端输出:
hello jacen
唯一需要注意的是,客户端post出去的data是json格式的字符串,而不是python的字典对象。
这样的好处是,只要在jsonServer中自定义方法(函数),python客户端就可以远程操作服务器
2022-02-18
#10
回复#13 @jacen :
非常感谢!又学到一个非常有用的库!
服务器端:
from jsonrpclib.SimpleJSONRPCServer import SimpleJSONRPCServer
server = SimpleJSONRPCServer(("localhost", 12306))
server.register_function(lambda z: z*z, "pow")
server.serve_forever(poll_interval=0.5)客户端:
import jsonrpclib
server = jsonrpclib.Server("http://127.0.0.1:12306")
print(server.pow(12306))输出:
151437636
登录后方可回帖

同样的,用Python的Flask搭建服务器也非常方便,再用aardio的inet.http进行访问,可以实现双向交互。
Python Flask服务器端
from flask import Flask, Response, render_template, render_template_string, request from threading import Thread def run_server(ip, port): app = Flask(__name__) @app.route("/") def index(): print(request.headers.get("User-Agent", None)) if request.headers.get("User-Agent", None) == "Aardio": return Response("Hello, aardio") else: return Response("Access Dany! 503 Error") app.run(ip, port) t = Thread(target=run_server, args=("127.0.0.1", 16544)) t.setDaemon(True) t.start() input('Server is running.\nPress any key to quit...')服务器输出:
runfile('C:/Users/xujr1/Documents/aardio/project/aardio2py/client.py', wdir='C:/Users/xujr1/Documents/aardio/project/aardio2py') * Serving Flask app "client" (lazy loading) * Environment: production WARNING: This is a development server. Do not use it in a production deployment. Use a production WSGI server instead. * Debug mode: off * Running on http://127.0.0.1:16544/ (Press CTRL+C to quit) 127.0.0.1 - - [16/Feb/2022 13:03:03] "GET / HTTP/1.1" 200 - Aardio Server is running. Press any key to quit...aardio客户端:
import inet.http; http = inet.http("Aardio") resp = http.get("http://127.0.0.1:16544") mainForm.edit.print(resp);