從標題「LoadVars vs. Flash Remoting」來看,我想這絕對夠直覺本文想要表達的是什麼~沒錯~ Flash可以藉由著許多種方式和後端程式溝通,尤其是採用loadVariables、LoadVars這種純文字(Plain Text)方式的傳輸最便利使用,然而它真的是純文字嗎?而Flash Remoting真的就是用binary format來傳輸嗎?
本文將藉由著Ethereal封包捕捉工具來協助我們探討底層的傳輸格式~
LoadVars - Plain Text
我們寫一個簡單的小範例來做測試~
Flash ActionScript
var data_lv:LoadVars = new LoadVars(); data_lv.name = "Flash"; data_lv.sendAndLoad("http://localhost/LoadVars.php",data_lv,"POST"); data_lv.onLoad = function(success) { if(success) { trace("Loaded!"); trace(this.value); }else{ trace("Failed!"); } }
PHP (LoadVars.php)
<?php echo "&value=Hello! " . $_POST['name']; ?>
Ethereal捕捉請求封包(Plain Text)
Ethereal捕捉回應封包(Plain Text)
從上述所捕捉的封包很明確的,在請求時送出「name=Flash」,而在接收時則為「&value=Hello! Flash」,兩者的確都是採用純文字的方式來傳輸~
Flash Remoting - AMF3
Flash ActionScript
var myService = new NetConnection() myService.connect("http://localhost/amfphp/gateway.php"); var responder = new Responder(onResult, onFault); myService.call("Hello.sayHello", responder,"Java"); function onResult(result) { trace(result); } function onFault(f:Event ) { trace("There was a problem: " + f.description); } stop();
PHP (Hello.php)
<?php class Hello { function sayHello($name) { return "Hello! $name"; } } ?>
Ethereal捕捉請求封包(AMF)
Ethereal捕捉回應封包(AMF)
(反白區就是請求與回應的位元組)
所以從上述所捕捉的封包來看~ Flash Remoting的確是採用binary format來傳輸,然而這只是一個簡單的小範例,所以尚無法將Remoting的優點發揮出來~
而筆者比較感興趣的地方就在於請求封包中的前二個位元組分別為「0x00、0x03」,其實這就是代表著此傳輸的AMF版本為AMF3,而緊接著一連串的位元組尚需要時間去做更深入的剖析,筆者有時間再為大家來分享~