您的位置:首页 > 大数据 > 人工智能

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

2012-03-31 14:09 411 查看


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

发表于 2011
年 12 月 10 日

运行平台:Adobe
AIR 2+

语言:ActionScript
3.0

使用到的软件:Adobe
Flash Builder 4.5

提要:
本篇主要介绍了如何使用Adobe AIR 2的Native
Process
调用Curl命令,包括在mac和windows两个系统分别实现此特性。本篇写作的时候应用还在开发过程中,部分内容还有待完善补充。

相关文章:

Communicating
with native processes in AIR

Interacting
with a native process

Using
the Adobe AIR 2 NativeProcess API to create a screen recorder

Upload
to S3 with cURL and AIR NativeProcess

Using
the AIR 2.0 Native Process API to control MPlayer

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/
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: