Home > 语言编程 > Actionscript使用Scoket方式发送HTTP请求实现

Actionscript使用Scoket方式发送HTTP请求实现

FLash在安全方面的保守让它成为了最安全和最广泛的RIA应用开发技术,但是对程序员来说那可能不会那么轻松了,比如最简单的http请求,通常
会被系统拦截,所以我们需要一种再底层的方式来实现Http请求。

以下是ActionScript中最常用的Http请求的使用代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
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连接。

演示代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
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提供的准确代码

Categories: 语言编程 Tags: ,
  1. No comments yet.
  1. October 17th, 2009 at 11:06 | #1