aardio 搭建Http服务器与Python客户端交互

By jerryxjr1220 at 2022-02-16 • 1人收藏 • 752人看过

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)

p.PNG

客户端可以利用Cookies来存储必要身份信息

12 个回复 | 最后更新于 2022-02-18
2022-02-16   #1

同样的,用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);


2022-02-16   #2

我觉得利用webscoket会不会更好?

2022-02-16   #3

回复#2 @admin :

websocket.tcp一般用于保持连接,或者传输大型文件。

http协议可以不用保持连接状态,访问一次握一次手

2022-02-16   #4

其实主要就是为了实现界面UI和业务逻辑的分离,用aardio画界面太方便了,而且打个包很小,给到用户很方便。业务端要处理复杂任务,比如要跑神经网络,没有python的第三方库根本跑不了,打包的话巨大无比还不一定能打包成功。

2022-02-16   #5

回复#4 @jerryxjr1220 :

好的

2022-02-16   #6

回复#4 @jerryxjr1220 :

句句在理。有了aardio 。微软.NET和 Intel少赚了一个0.

2022-02-16   #7

回复#7 @jacen :

好的,学习了,目前前端和后端分离的目的已经可以达到了,后面再去研究一下HTTP-JSON-RPC 和 web.rest,多谢指教

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-17   #9

screenshots.gif

后端处理结果反馈到前端

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


2022-02-18   #11

我比较看好用web.form写界面

2022-02-18   #12

回复#15 @smaug :

这个其实不矛盾的,用jsonrpc可以实现前后端分离,哪怕不在同一地点都无所谓,只要有网络就可以实现交互。至于前端用aardio的plus画还是web.form写界面都无所谓。

登录后方可回帖

登 录
信息栏
公告:
个人博客
专注分享
谢谢合作!

本站域名:HtmLayout.Cn
aardio可以快速开发上位机,本站主要记录了学习过程中遇到的问题和解决办法及aardio代码分享

这里主要专注于aardio学习交流和经验分享.
纯私人站,当笔记本用的,学到哪写到哪.

Aardio 官方站:Aardio官方
Aardio最新功能:Aardio官方更新日志
本 站 主 站:Stm32cube中文网
Sciter中文在线文档Sciter在线学习文档
空间赞助:才仁机械
打赏本站
Loading...