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

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

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写界面都无所谓。

登录后方可回帖

登 录
信息栏
 私人小站

本站域名

ChengXu.XYZ

投诉联系:  popdes@126.com



快速上位机开发学习,本站主要记录了学习过程中遇到的问题和解决办法及上位机代码分享

这里主要专注于学习交流和经验分享.
纯私人站,当笔记本用的,学到哪写到哪.
如果侵权,联系 Popdes@126.com

友情链接
Aardio官方
Aardio资源网


才仁机械


网站地图SiteMap

Loading...