运行效果:
aria2是一个非常优秀的开源免费下载工具,aria2提供的调用接口类似 chrome,也是使用WebSocket + JSON-RPC 2.0协议,使用aardio标准库中的 web.socket.jsonClient 几句代码就可以直接调用了。我写几个简单的调用,更多的接口大家可以看看文档: https://aria2.github.io/manual/en/html/aria2c.html#rpc-interface
aria2运行时会显示控制台窗口,如果我们自己做个下载界面可能不想显示这个控制台窗口,使用 aardio中的process.popen启动aria2就可以隐藏控制台窗口了,但是这个会带来一个问题,就是下着下着突然就断线没反应了。之前已经注意到了这个问题,但没有时间仔细研究。今天有空,仔细的看了一下,发现如果不隐藏控制台就不会断线,猜测是进程管道写满了,然后写了个定时器,不断的把控制台的内容使用process.popen的peek()函数读出来,就正常了,解决问题的代码如下:
winform.setInterval(
1000,function(){
prcs.peek();//prcs是process.popen对象
}
)
于是我考虑稍微封装一下这个启动aria2的代码做一个扩展库,做扩展库的时候打开aria2的文档在看,看到有个--quiet的启动参数可以让aria2不写控制台,然后加了这个参数试了一下,发现不用调用prcs.peek() 了。
下面是最新的示例代码: import win.ui;
/*DSG{{*/
var winform = win.form(text="调用aria2 JSON-RPC接口";right=770;bottom=467)
winform.add(
btnSend={cls="button";text="调用aria2下载文件";left=597;top=413;right=739;bottom=458;db=1;dr=1;z=3};
txtData={cls="edit";text="http://download.aardio.com/aardio/aardio.7z";left=34;top=416;right=587;bottom=455;db=1;dl=1;dr=1;edge=1;multiline=1;z=2};
txtMessage={cls="edit";left=29;top=22;right=741;bottom=363;db=1;dl=1;dr=1;dt=1;edge=1;multiline=1;z=1}
)
/*}}*/
import process.aria2;
var aria2 = process.aria2();
aria2.startServer("--max-connection-per-server=16")
//获取JSON-RPC客户端
var jsonClient = aria2.jsonClient();
//显示错误信息
jsonClient.on("error",function(err){
winform.txtMessage.print("出错了",err);
});
//监听aria2事件
jsonClient.on("aria2.onDownloadStart",function(param){
winform.txtMessage.print("aria2.onDownloadStart,原因:"+web.json.stringify(param));
})
//调用aria2打开一个网页
winform.btnSend.oncommand = function(id,event){
jsonClient.aria2.addUri({winform.txtData.text}).end = function(result,err){
if(err)
winform.txtMessage.print("下载出错了",web.json.stringify(err))
else {
winform.txtMessage.print("成功添加任务",web.json.stringify(result))
}
}
}
//启动就绪执行
aria2.ready(
function(){
jsonClient.aria2.getGlobalOption().end = function(result,err){
winform.txtMessage.print(result)
}
}
)
winform.onClose = function(hwnd,message,wParam,lParam){
jsonClient.aria2.shutdown();
}
winform.show();
win.loopMessage();
感谢zjldh提供的例子:
|