使用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来检测当前运行环境是否支持NativeProcessif (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/
相关文章推荐
- 使用C#调用外部Ping命令获取网络连接情况
- Windows下安装使用curl命令
- Linux中使用curl命令访问https站点4种常见错误和解决方法
- linux命令行下使用反斜杠“\”调用别名的原命令
- jenkins学习之使用curl命令触发任务
- curl命令的使用
- CURL命令使用
- grep命令和curl命令的使用方法
- windows(64位)下使用curl命令
- windows(64位)下使用curl命令
- 在vc中多次调用dos命令,循环使用CreateProcess的
- php中使用exec,system等函数调用系统命令的方法(不建议使用,可导致安全问题)
- windows使用curl命令
- 使用C#调用外部Ping命令获取网络连接情况
- curl下载及上传命令使用整理
- curl命令使用(转)
- windows使用curl命令
- 使用python subprocess模块实现调用shell执行命令
- java使用ssh调用shell命令获取KVM数据(KVM需要通过libvirt管理)
- 使用 Linux 系统调用的内核命令