banner
李大仁博客

李大仁博客

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

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 = "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 接続を確立 -> 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("接続...成功");
    //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 プログラミングマニュアルを参考に一部修正しました。問題がある場合は、Adobe が提供する正確なコードを参照してください。

読み込み中...
文章は、創作者によって署名され、ブロックチェーンに安全に保存されています。