banner
李大仁博客

李大仁博客

天地虽大,但有一念向善,心存良知,虽凡夫俗子,皆可为圣贤。

使用Scoket方式發送HTTP請求的Actionscript實現

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 = "http://www.lidaren.com/";
var loader = new URLLoader();
//add EventListener
//Load Complete
loader.addEventListener(Event.COMPLETE, completeHandler);
var request = new URLRequest(url);
//Http Request Method
request.method = URLRequestMethod.POST;
try {
//Load
loader.load(request);
} catch (error) {
trace ("無法加載所請求的文檔。");
}
}

private function completeHandler(event:Event):void {
  var loader:URLLoader = URLLoader(event.target);
  trace("數據內容: " + 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("數據->"+buffer);
}

}

以上代碼部分參考自 Adobe 官方 AS3 programming 手冊。如有問題,大家可以參考 Adobe 提供的準確代碼

載入中......
此文章數據所有權由區塊鏈加密技術和智能合約保障僅歸創作者所有。