关闭

使用Adobe AIR 2的Native Process调用Curl命令

标签: adobeair文件传输工具outputactionscriptterminal
766人阅读 评论(0) 收藏 举报
分类:

使用Adobe AIR 2的Native Process调用Curl命令

运行平台:Adobe AIR 2+
语言:ActionScript 3.0
使用到的软件:Adobe Flash Builder 4.5
提要:
本篇主要介绍了如何使用Adobe AIR 2的Native Process调用Curl命令,包括在mac和windows两个系统分别实现此特性。本篇写作的时候应用还在开发过程中,部分内容还有待完善补充。
相关文章:

AIR 2已经出来有段时日了,最近公司内部有个需求,需要通过AIR调用Curl命令,才用上了这个AIR 2的特性Native Process。查了不少文章,比较少能完完整整使用的,要么只是hellow world的级别要么就是转载翻译Adobe官方的文章。我在自己使用完之后,才感觉真的是一个强大实用的特性,值得我们去学习使用。使用NativeProcess可以和系统原生应用进行通行,将系统的一些原生特性打包到AIR应用中。为了实用这个特性,我们需要将AIR应用发布成系统原生安装格式,例如Windows需要发布成exe,Mac需要发布成dmg。如果是Mac系统,curl环境是已有的,而对于windows系统就需要将curl打包到air应用中去。

Native Process定义:

NativeProcess 类提供命令行整合和通常的发送功能。NativeProcess 类让AIR 程序在主机操作系统上执行本地流程。AIR 程序能监控流程的标准输入(stdin )和标准输出(stdout )流,及流程的标准错误(stderr )流。

关于Curl:

curl是利用URL语法在命令行方式下工作的文件传输工具。关于curl可以参考:
http://curl.haxx.se/
http://baike.baidu.com/view/1326315.htm

本案例使用到的命令是:
curl –output /dev/null –write-out “resolve: %{time_namelookup},connect: %{time_connect},pretransfer: %{time_pretransfer},starttransfer: %{time_starttransfer},total time: %{time_total}\n” –silent
主要是检测网络链接各个步骤的几个时间值,使用mac系统的Terminal调用,查看http://www.weibo.com
打开Terminal,输入命令:curl –output /dev/null –write-out “resolve: %{time_namelookup},connect: %{time_connect},pretransfer: %{time_pretransfer},starttransfer: %{time_starttransfer},total time: %{time_total}\n” –silent http://www.weibo.com

得到的结果:

可以看到最终的结果是:resolve: 1.115,connect: 1.157,pretransfer: 1.157,starttransfer: 1.217,total time: 1.217

接下来我们就要把这个功能集成到Adobe AIR应用中去。并将获得的数据显示成图表。最终结果如下:
案例中使用到了微博图表组件,微博图表的代码暂时还未开源,所以下面只是介绍主要的一些代码,或得到数据后,无论使用什么形式展示都是没问题的。

Step1:创建AIR工程

创建一个Flash Builder的AIR工程

Step2:创建界面记本结构

使用MXML创建界面基本结构:

<mx:VBox left="10" right="10" top="10" bottom="10"
    horizontalAlign="left">
  <mx:Label text="URL:" textAlign="left"/>
  <mx:TextInput id="textToSend" width="100%"
      text="http://www.weibo.com"/>
  <mx:Button id="submitBtn" label="Submit" click="writeData()"/>
  <mx:Spacer/>
  <s:HGroup verticalAlign="middle">
    <mx:Label fontSize="14" text="Log:" textAlign="left"/>
    <s:Spacer width="85" />
    <s:Button label="clear" id="btnClearLog"
       click="btnClearLog_clickHandler(event)"/>
  </s:HGroup>
    <s:HGroup width="100%" height="100%">
    <s:TextArea id="textReceived" width="200" height="100%"/>
    <s:Spacer width="10" />
    <s:SpriteVisualElement width="370" height="100%" id="chartCont"/>
  </s:HGroup>
</mx:VBox>

基本上就是一个输入框,可输入需要检测的url,一个Submit按钮,一个日志显示的文本区域。

Step3:检测是否支持NativeProcess

在应用applicationComplete的时候调用初始化函数,使用NativeProcess.isSupported来检测当前运行环境是否支持NativeProcess

if (NativeProcess.isSupported){
    launchCurl();
}else{
    textReceived.text = "NativeProcess not supported.";
}

Step4:启动Curl

根据操作系统启动Curl,并侦听相关的一些事件

public function launchCurl():void
{
  var file:File = File.applicationDirectory;
  if (Capabilities.os.toLowerCase().indexOf("win") > -1){
    //windows需要集成curl,暂未处理
  }else if (Capabilities.os.toLowerCase().indexOf("mac") > -1){
    file = file.resolvePath("/bin/bash");
  }

  var nativeProcessStartupInfo:NativeProcessStartupInfo = new NativeProcessStartupInfo();
  nativeProcessStartupInfo.executable = file;
  nativeProcessStartupInfo.arguments = args;

  process = new NativeProcess();
  process.start(nativeProcessStartupInfo);
  process.addEventListener(NativeProcessExitEvent.EXIT, onExit);
  process.addEventListener(Event.STANDARD_OUTPUT_CLOSE, onOutputClose);

  process.addEventListener(ProgressEvent.STANDARD_OUTPUT_DATA, onOutputData);
  process.addEventListener(ProgressEvent.STANDARD_ERROR_DATA, errorDataHandler);

  process.addEventListener(IOErrorEvent.STANDARD_OUTPUT_IO_ERROR, onIOError);
  process.addEventListener(ProgressEvent.STANDARD_INPUT_PROGRESS, inputProgressListener);
  process.addEventListener(Event.STANDARD_INPUT_CLOSE, onStandardInputClose);
  process.addEventListener(IOErrorEvent.STANDARD_INPUT_IO_ERROR, onStandInputIOError);
}

Step5:使用standardInput写入命令

使用process的standardInput向curl写入命令

public function writeData():void
{
  submitBtn.enabled = false;
  var cmd:String = 'curl --output /dev/null --write-out "resolve: %{time_namelookup},connect: %{time_connect},pretransfer: %{time_pretransfer},starttransfer: %{time_starttransfer},total time: %{time_total}\n" --silent ';
  cmd += textToSend.text;
  cmd += " \n";
  process.standardInput.writeUTFBytes(cmd);
}

Step6:读取通过standardOutput输出的数据

通过捕捉ProgressEvent.STANDARD_OUTPUT_DATA,读取process的standardOutput获得命令调用后输出的数据

public function onOutputData(event:ProgressEvent):void
{
  var str:String = process.standardOutput.readUTFBytes(process.standardOutput.bytesAvailable);
  textReceived.appendText(str);
  textReceived.appendText("\n");
}

只许对这个读取到的字符串进行解析,就能获得你要的数据了。


文章出处:http://www.flashache.com/2011/12/10/adobe-air2-native-process-curl/

0
0

猜你在找
【套餐】Hadoop生态系统零基础入门
【套餐】嵌入式Linux C编程基础
【套餐】2017软考系统集成项目——任铄
【套餐】Android 5.x顶级视频课程——李宁
【套餐】深度学习入门视频课程——唐宇迪
【直播】广义线性模型及其应用——李科
【直播】从0到1 区块链的概念到实践
【直播】计算机视觉原理及实战——屈教授
【直播】机器学习之凸优化——马博士
【直播】机器学习&数据挖掘7周实训--韦玮
查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:92296次
    • 积分:1171
    • 等级:
    • 排名:千里之外
    • 原创:7篇
    • 转载:82篇
    • 译文:1篇
    • 评论:16条
    最新评论