本库封装心得:

1、aardio回调函数是被dll用线程启动的,所以在声明回调函数时,不能用 ..raw.tostdcall() ,而是要用 ..thread.tostdcall()。

2、因为线程安全的原因,回调函数不能访问主线程的成员,比如窗口组件。所以在定义回调函数时,给他指定一个owner(比如 winform 或 {form=winform} ),在回调函数中,就可以用 owner 或 owner.form 来访问主窗口对象 winform 了。

3、本库所用sunny.dll不支持内存加载。

4、进行函数功能分类(模块化),以方便调用。

一、SUNNY网络中间件是什么:

Sunny网络中间件 和 Fiddler 模块类似。是可跨平台的网络分析组件。可用于 HTTP / HTTPS / WS / WSS / TCP 网络分析,无内存泄漏,为二次开发量身制作。

Sunny项目主要用于易语言 (其他语言也可使用)目前免费且开源。应dio友需求,我将他封装为aardio库,供有此功能需求的dio友们下载使用。

Sunny官方网站:http://esunny.vip/

SDK功能:

1.支持 获取/修改 HTTP/HTTPS/WS/WSS/TCP 发送及返回数据

2.支持 HTTP/HTTPS/WS/WSS 设置全局代理(上游代理)

3.支持 对 HTTP/HTTPS/WS/WSS 指定连接使用指定代理

4.支持 对 HTTP/HTTPS/WS/WSS 链接重定向

5.支持 对 TCP链接进行IP重定向

6.支持 gzip, deflate, br 解码

7.支持 WS/WSS 主动发送数据

8.支持 TCP 主动发送数据

二、运行效果截图:

三、库文件下载:

解压后放到 /lib/godking/ 目录。

chengxu.online  → aardio资源下载 → sunny.rar

四、库结构:

五:部分解释:

1、消息类型 msgType 分为三类,http_(含https)、ws_(含wss)、tcp_ 。

2、传输模式 mod 分为两类,http类(POST、GET、PUT等)、ws类(WS、WSS)。

3、一条request(或send)消息可能对应着与其相同id(不是msgid)的多条response(或received)消息,代表这些请求(发送)与响应(接收)是对应的因果关系。

4、在http_request消息里面,可以直接返回response数据。其实应该解释为“伪造”更容易理解,因为这时候还没有接收到response,却已经提前造好了response数据 ^-^。

5、sunny正常情况下不拦截自身进程数据,即使开启进程代理并使用process.addPID将自身pid添加进去也不行。但是可以通过使用sunny.start()指定代理端口,达到拦截自身进程数据的目的。只拦截自身进程不用开全局代理。用法如下:

5.1、为实现拦截自身 web.view 数据,需要在web.view参数中使用代理。

端口号要与sunny.start() 中指定的代理端口号一致:

var wb = web.view(winform,,`--proxy-server="socks://127.0.0.1:2021"`);

5.2、如果要拦截自身 inet.http 数据,设置代理方式如下:

inet.http(,"HTTP=HTTP://127.0.0.1:2021").get("http://www.baidu.com");
6、回调函数均为多线程函数,非主线程函数,对aardio来说,使用时要注意因线程安全所产生的各种“问题”。

六:调用示例:

import win.ui;
import godking.vlistEx
/*DSG{{*/
var winform = win.form(text="aardio form";right=929;bottom=609;topmost=1)
winform.add(
button={cls="button";text="开始HTTP拦截";left=380;top=540;right=537;bottom=593;db=1;dr=1;z=1};
button2={cls="button";text="停止";left=560;top=540;right=717;bottom=593;db=1;dr=1;z=2};
button3={cls="button";text="打开ws测试网站";left=200;top=540;right=357;bottom=593;db=1;dl=1;z=4};
button4={cls="button";text="打开wss测试网站";left=20;top=540;right=177;bottom=593;db=1;dl=1;z=8};
button5={cls="button";text="设置进程PID";left=820;top=540;right=910;bottom=580;z=10};
edit={cls="edit";left=740;top=540;right=810;bottom=580;edge=1;multiline=1;z=9};
rb1={cls="radiobutton";text="替换图片";left=90;top=500;right=243;bottom=528;checked=1;db=1;dl=1;font=LOGFONT(h=-16);z=5};
rb2={cls="radiobutton";text="阻止图片";left=270;top=500;right=423;bottom=528;db=1;dl=1;dr=1;font=LOGFONT(h=-16);z=6};
rb3={cls="radiobutton";text="图片放行";left=440;top=500;right=593;bottom=528;db=1;dr=1;font=LOGFONT(h=-16);z=7};
vlist={cls="win.ui.ctrl.vlistEx";text="自定义控件";left=10;top=8;right=920;bottom=490;db=1;dl=1;dr=1;dt=1;z=3}
)
/*}}*/winform.vlist.setColumns({"序号","协议类型","消息类型","传输模式","url"},{40,70,120,70,-1});import godking.sunny;
var sunny=godking.sunny();
sunny.callback_http = function(winform,context,id,msgid,msgtype,mod,url,err,pid){// 注意:1、回调函数为线程函数;2、要重新引用godking.sunnyimport godking.sunny// 将部分内容写入窗口虚表中winform.vlist.addRow("[@rowindex]","http/s",godking.sunny.msgType.getName_http(msgtype),mod,url)winform.vlist.ensureVisible(winform.vlist.count)// 将图片请求进行替换if msgtype==godking.sunny.msgType.http_request and !winform.rb3.checked {var request = godking.sunny.httpRequest(msgid);var t = request.getHeader("Content-Type")import stringif ..string.find(url,"@@.jpg") or ..string.find(url,"@@.jpeg") or ..string.find(url,"@@.png"){if winform.rb1.checked request.setUrl("http://chengxu.online/images/banner.gif");if winform.rb2.checked request.setUrl("");}}// 过滤掉图片的正文消息if msgtype==godking.sunny.msgType.http_response and notice {var request = godking.sunny.httpResponse(msgid);var t = request.getHeader("Content-Type")if #t{import stringif ..string.find(t,"@image/"){return true; }}}
}sunny.callback_websocket = function(winform,context,id,msgid,msgtype,mod,url,err,pid,wsDataType){// 注意:1、回调函数为线程函数;2、要重新引用godking.sunnyimport godking.sunny// 将部分内容写入窗口虚表中winform.vlist.addRow("[@rowindex]","websocket",godking.sunny.msgType.getName_ws(msgtype),mod,url)winform.vlist.ensureVisible(winform.vlist.count)// 拦截发送数据if msgtype==godking.sunny.msgType.ws_send {var ws = godking.sunny.webSocket(msgid);var t = ws.getBodyText();winform.vlist.addRow("[@rowindex]","websocket","发送数据",mod,t)winform.vlist.ensureVisible(winform.vlist.count)t = t++"(已修改)"ws.setBody(t)}// 拦截接收数据if msgtype==godking.sunny.msgType.ws_received {var ws = godking.sunny.webSocket(msgid);var t = ws.getBodyText();winform.vlist.addRow("[@rowindex]","websocket","接收数据",mod,t)winform.vlist.ensureVisible(winform.vlist.count)}
}   winform.button.oncommand = function(id,event){if sunny.start(2021/*代理端口*/,true/*开启全局IE代理*/,/*上游代理*/,/*上游代理规则*/,/*脚本*/,/*强制TCP*/,true/*禁止压缩*/,winform){..win.msgbox("已开启!",,,winform.hwnd);} else {..win.msgbox("开启失败!",,,winform.hwnd);}
}winform.button2.oncommand = function(id,event){sunny.stop();..win.msgbox("已停止!",,,winform.hwnd);
}winform.button3.oncommand = function(id,event){import processprocess.execute("http://coolaf.com/tool/chattest")
}winform.button4.oncommand = function(id,event){import processprocess.execute("https://www.idcd.com/tool/socket")
}winform.button5.oncommand = function(id,event){if winform.edit.text!=="" {sunny.setIeProxy(false);var pid = tonumber(winform.edit.text);sunny.process.start()sunny.process.addPid(pid)..win.msgbox("已加入!",,,winform.hwnd);}
}winform.show();
win.loopMessage();

aardio - 【库】sunny网络中间件相关推荐

  1. aardio利用sunny中间件实现只显示网页部分内容

    前两天有个朋友有个需求,在利用aardio开发的软件打开一个网站时,首页只想显示部分内容,其他信息不显示.aardio的web.form有一个显示部分网页的范例,可以实现需求,但是用这种方式打开的网页 ...

  2. aardio - 利用sunny修改网页显示内容

    参考网友 庄.园 (zhuang8750) 的文章:https://blog.csdn.net/zhuang8750/article/details/123488702?utm_source=app& ...

  3. 【沉淀】从网络中间件到搜索,从移动开发到分布式计算平台,阿里高级专家李睿博谈自己的折腾路...

    <沉淀>是云栖社区展示专家风采的人物栏目.它呈现每个专家独一无二的人生经历.认识和感悟的同时,也能帮助你沉淀技术,收获对技术和人生的判断.我们的想法是:"若你想精进为一个很厉害的 ...

  4. Android Volley 库通过网络获取 JSON 数据

    本文内容 什么是 Volley 库 Volley 能做什么 Volley 架构 环境 演示 Volley 库通过网络获取 JSON 数据 参考资料 Android 关于网络操作一般都会介绍 HttpC ...

  5. C++常用库之网络库

    C++一个很大的用途就是作为网络层组件的开发语言.C++开发的第三方网络库也比较多.其实,c语言下的网络库也不少.现在简单介绍一下. ACE库 ACE是一个大型的中间件产品,代码有几十万行,非常宏大, ...

  6. python网络编程库_Python网络编程——协程

    协程的概念 协程,又称微线程,纤程,也称用户级线程,在不开辟线程的基础上实现多任务,也就是在单线程的情况下完成多任务,多个任务按照一定顺序交替执行的,通俗理解只要在def里面只看到一个yield关键字 ...

  7. python深度学习库keras——网络建模全解

    全栈工程师开发手册 (作者:栾鹏) python教程全解 一.数据预处理 1.序列预处理 1.1.填充序列pad_sequences keras.preprocessing.sequence.pad_ ...

  8. 利用python you-get库下载网络视频、音乐及图片

    Python,让繁琐工作高效便捷:利用python you-get库单个.批量下载网络视频.音乐及图片,you-get命令需要在cmd窗口中运行. 很多人学习python,不知道从何学起. 很多人学习 ...

  9. python ffmpeg读取摄像头_使用ffmpegpython库捕获网络摄像头

    嗨,我正在尝试使用ffmpeg python包装库(https://github.com/kkroening/ffmpeg-python)捕获一个使用python的网络摄像头流 我有一个有效的ffmp ...

最新文章

  1. linux 虚拟化之rhev Hypervisor 安装
  2. linux 下使用 curl 访问带多参数,GET掉参数解决方案
  3. .NET 3.5 - DLINQ(LINQ to SQL)之面向对象的添加、查询、更新和删除
  4. Nacos(七)之Spring Cloud集成
  5. 提高数据库处理查询速度
  6. 怎么判断两颗二叉树相等
  7. 官网下载JDK需要登陆的Oracle账号
  8. python图像卷积_图像处理——卷积原理、二维卷积python实现
  9. ios如何看idfv_ios获取手机状态 idfa   idfv   网络类型   分辨率   获取运营商
  10. python counter 出现次数最少的元素_[PY3]——找出一个序列中出现次数最多的元素/collections.Counter 类的用法...
  11. springboot中添加静态资源的方式,默认的静态资源文件夹有哪些
  12. Wordnet 与 Hownet 比较
  13. 一般纳税人税额计算_一般纳税人企业缴税计算
  14. CLRInjection - 通用托管注入(超级灰色按钮克星升级版)
  15. 人工智能2021截稿日期_2019年136个国际学术会议资讯 (含截稿日期)
  16. 查看局域网内的所有IP地址
  17. 【学习笔记】Nake Statistics
  18. Oracle 同比环比
  19. 在微信小程序中实现文字呼吸效果
  20. Linux命令简写和全称

热门文章

  1. lucene索引MySQL原因_影响Lucene索引速度原因以及提高索引速度技巧
  2. 最新阿里腾讯头条美团等iOS面试总结
  3. MTK开发之—开机永不灭屏
  4. python:四位玫瑰数
  5. java扫雷布雷算法_java 扫雷 如何随机布雷?
  6. 大数据行业如何获取高薪岗位offer?
  7. 实现页面刷新(全局刷新)
  8. 超详细|一篇搞定操作系统——用户接口
  9. 工业视觉系统相关知识和选型介绍(一):相机篇
  10. STM32单片机WIFI物联网可燃气烟雾报警监控系统MQ4MQ2