ExternalInterfaceで送れるデータの限界&全ブラウザ対応のブラクラができた

Posted on 10月 26, 2008
Filed Under ExternalInterface, flash, as3, javascript |

最初はブラクラなんてつくる気無かったんですが。

今度ExternalInterfaceを使って最大kBオーダーのテキストをjavascript→Flashに渡すようなアプリをつくるかもしれなくて、
ExternalInterface.addCallbackの限界を試したかったんです。

その結果は、IE7、FF2ともに 33,554,432[Byte]まではokだった。
その2倍はNG。IE7,FF2ともにメモリが不足しています、っていってjsがエラーる。

へー。

そしたらExternalInterface.callでFlash→javascriptにどんだけ渡せるのか試したくなる。

16,777,216[Byte]まではok。その2倍はIE7,FF2ともにNG。Flash側でメモリが足りなくなるようで、
IE7,FF2ともに終了。

へーへー。

Opera9.*,Safari3(Windows)も死亡
macは試してない

しかし、意外とたくさん送れるもんだなぁ。

検証コードはこんな

actionscript3

Actionscript:
  1. package {
  2.     import flash.display.Sprite;
  3.     import flash.system.Security;
  4.     import flash.external.ExternalInterface;
  5.     import flash.utils.setTimeout;
  6.     public class RPCClient extends Sprite{
  7.         private var debug :Boolean = true;
  8.         Security.allowDomain('*');
  9.  
  10.         public function RPCClient(){
  11.             ExternalInterface.addCallback("xi_send", xi_send);
  12.             var message :String = "a";
  13.             setTimeout( function() :void {
  14.                 message = message + message;
  15.                 ExternalInterface.call("show_length_of('"+message+"')");
  16.                 setTimeout( arguments.callee, 50 );
  17.             }, 50 );
  18.         }
  19.  
  20.         private function xi_send( st :String ) :void {
  21.             logger("[xi_send]len: "+st.length);
  22.         }
  23.  
  24.         private function logger(... args):void{
  25.             if(!debug){ return; }
  26.             log.apply(null,(new Array("[RPCClient]",this)).concat(args)); // to firebug
  27.             //ExternalInterface.call("alert('"+args+"')");
  28.         }
  29.     }
  30. }

javascript
require prototype.js

JavaScript:
  1. RPC = new function() {
  2.     var clientid = "externalRPCClient";
  3.     return {
  4.         client : null,
  5.         init : function() {
  6.             var so = new SWFObject( '/swf/RPCClient.swf', clientid, 1, 1, "9", "#FFFFFF" );
  7.             so.addParam("allowScriptAccess", "always");
  8.             so.addParam("align", "middle");
  9.             so.addParam("wmode","transparent");
  10.             so.addVariable( "key", "whatever" );
  11.             so.write( "rpc_container" );
  12.         },
  13.         start : function() {
  14.             this.client = navigator.userAgent.match(/MSIE/) ? window[clientid] : document[clientid];
  15.             if ( !this.client || typeof(this.client.xi_send)!="function" ) {
  16.                 console.log("[start]not ready");
  17.                 return;
  18.             }
  19.             var sending_message = "a";
  20.             new (function() {
  21.                 sending_message = sending_message + sending_message;
  22.                 this.client.xi_send( sending_message );
  23.                 setTimeout( arguments.callee.bind(this), 50 );
  24.             }.bind(this));
  25.         }
  26.     };
  27. }
  28. document.observe("dom:loaded", RPC.init.bind(RPC));
  29.  
  30. function show_length_of( message ) {
  31.     alert("[show_length_of]"+message.length);
  32.     //console.log("[show_length_of]"+message.length);
  33. }

デモ
※注意。ブラウザが強制終了します
http://maaash.jp/lab/crasher/

Comments

One Response to “ExternalInterfaceで送れるデータの限界&全ブラウザ対応のブラクラができた”

  1. maxfactory | Flash lite(携帯Flash)、Flex、widgetなどの技術メモ » [as]ExtenalInterfaceの通信データ最大サイズ on 7月 22nd, 2009 15:18

    […] http://maaash.jp/javascript/externalinterface%E3%81%A7%E9%80%81%E3%82%8C%E3%82%8B%E3%83%87%E3%83%BC%… カテゴリー: as3 タグ: コメント (0) トラックバック (0) […]

Leave a Reply