Actionscript使用Scoket方式发送HTTP请求实现
FLash在安全方面的保守让它成为了最安全和最广泛的RIA应用开发技术,但是对程序员来说那可能不会那么轻松了,比如最简单的http请求,通常
会被系统拦截,所以我们需要一种再底层的方式来实现Http请求。
以下是ActionScript中最常用的Http请求的使用代码
package { import flash.display.Sprite; import flash.events.*; import flash.net.URLLoader; import flash.net.URLRequest; import flash.net.URLRequestHeader; import flash.net.URLRequestMethod; import flash.net.URLVariables; public class URLRequestDemo extends Sprite { public function URLRequestDemo () { //Url String var url:String = "http://www.lidaren.com/"; var loader:URLLoader = new URLLoader(); //add EventListener //Load Complete loader.addEventListener(Event.COMPLETE, completeHandler); var request:URLRequest = new URLRequest(url); //Http Request Method request.method = URLRequestMethod.POST; try { //Load loader.load(request); } catch (error:Error) { trace("Unable to load requested document."); } } private function completeHandler(event:Event):void { var loader:URLLoader = URLLoader(event.target); trace("Data Content: " + loader.data); } } |
以上代码通过URLLoader来装载URLRequest获取的数据并输出,但是
问题就是出在这里,如果flash的安全设置不允许URLRequest,那就..
简单讲一下Flash是如何发送Http请求的过程,flash首先检查目标站点
的下是否存在crossdomain.xml,存在则读取并加载到安全策略中,没有
则使用默认的安全策略,crossdomain.xml中如允许请求,那么允许连
接,否则拦截,这一点与其他的语言不同,所以使用时需要注意,其他的
跟一般大家最常用的socket的通信方式一样的,建立Scoket连接->
发送Socket请求包-> 监听接受数据 ->关闭socket连接。
演示代码如下:
package { import flash.display.Sprite; import flash.events.Event; import flash.events.IOErrorEvent; import flash.events.ProgressEvent; import flash.net.Socket; import flash.system.Security; public class SocketDemo extends Sprite { public var port:int = 80; public var host:String = "www.lidaren.com"; public var sock:Socket; public var buffer:String; public function SocketDemo() { sock = new Socket(); sock.addEventListener(Event.CONNECT,connectHandler); sock.addEventListener(Event.CLOSE,closeHandler); sock.addEventListener(ProgressEvent.SOCKET_DATA,socketDataHandler); sock.addEventListener(Event.COMPLETE,completeHandler); Security.loadPolicyFile("http://"+host+":"+port+"/crossdomain.xml"); sock.addEventListener(IOErrorEvent.IO_ERROR,function(e:IOErrorEvent):void{trace("ioerr");}); sock.connect(host,port); } //完毕 public function completeHandler(event:Event):void { trace("completeHandler:"+event.target.data); } //关闭 public function closeHandler(event:Event):void { trace("close handler"); } public function connectHandler(event:Event):void { trace("Connect...Ok"); //设置Http请求头,其他协议的请求亦可 var header:String = "GET /filename.xxx HTTP/1.1 rn"; header += "Accept: */* rn" header += "Accept-Language: zh-cn rn"; header += "User-Agent: Mozilla/4.0"; header += "Host: " + host + ":" + port + " rn"; header += "Connection: Keep-Alive rn"; header += "Cache-Control: no-cache rnrn"; //写入请求头 sock.writeUTFBytes(header); //清空缓冲区,发送请求 sock.flush(); } //收到数据 public function socketDataHandler(event:ProgressEvent):void { trace("socketDataHandler:"+event.bytesLoaded); var data:String = sock.readUTFBytes(sock.bytesAvailable); buffer += data; trace("Data->"+buffer); } } |
以上代码部分参考自Adobe 官方AS3 programming手册。如有问题,
大家可以参考Adobe提供的准确代码
Recent Comments