templates/as3/org/rubyforge/dango/DangoClientFramework.as in dango_generator-0.3.6 vs templates/as3/org/rubyforge/dango/DangoClientFramework.as in dango_generator-0.3.8

- old
+ new

@@ -27,11 +27,10 @@ private var socket:Socket; //ソケット private var dispatcher:EventDispatcher; // Event送出用 private var default_encode_type:uint = 0; // 送信データのエンコードタイプはJSON - private var is_debug:Boolean; // Debugモードかどうかのフラグ private var is_connect:Boolean = false; // 接続完了しているかどうか private var frame_rate:uint = 24; // デフォルトのフレームレート(想定値) private var polling_timer:Timer; // ポーリング(ハートビート)用タイマーの設定 @@ -51,41 +50,47 @@ private var recv_do_count_no:uint = 0; // 受信実行の回数 private var recv_do_timer_msec:uint; // 受信実行用タイマーの実行間隔 private var recv_do_timer:Timer; // 受信実行用タイマーの追加 private var recv_do_last_date:Date = new Date(); // 受信キャッシュ用処理落ちチェック用 + private var send_recv_max_size:uint = 1024*1024; // データ送受信の最大バイト数 + public var server_time:String = ""; // サーバーの時計 // private var server_host:String = "172.31.1.74"; // private var server_host:String = "localhost"; // private var server_port:int = 15000; private var server_host:String; private var server_port:int; + private var is_debug:Boolean = false; // Debugモードかどうかのフラグ + private var disp_obj:DisplayObject; public var sid:int; + private var has_sid:Boolean = false; // sidを取得完了しているかどうか /** * DangoClientFramework * コンストラクタ * * @param config:* - * @param disp_obj:DisplayObject = null * @return void */ - public function DangoClientFramework(config:*, disp_obj:DisplayObject = null){ -// is_debug = d; // Debugモードかどうかのフラグ + public function DangoClientFramework(config:*){ + trace("DangoClientFramework start..."); + // 設定ファイルの読み込み + if(config.hasOwnProperty("server_host")){ server_host = config.server_host; } + if(config.hasOwnProperty("server_port")){ server_port = config.server_port; } + if(config.hasOwnProperty("is_debug" )){ is_debug = config.debug; } + if(config.hasOwnProperty("disp_obj" )){ disp_obj = config.disp_obj; } +// is_debug = true; + if(disp_obj){ + trace("disp_obj: " + disp_obj); frame_rate = disp_obj.stage.frameRate; // フレームレート } - // 設定ファイルの読み込み - server_host = config.server_host; - server_port = config.server_port; - is_debug = config.debug; -// is_debug = true; - var policy_file_protocol:String = config.policy_file_protocol; // var policy_file_port:uint = config.policy_file_port; var policy_file_path:String = config.policy_file_path; if(is_debug){ trace("flash player: " + Capabilities.version); } @@ -116,11 +121,11 @@ socket.addEventListener(ProgressEvent.SOCKET_DATA, socketDataHandler, true); socket.addEventListener(SecurityErrorEvent.SECURITY_ERROR, securityErrorHandler, false); socket.addEventListener(SecurityErrorEvent.SECURITY_ERROR, securityErrorHandler, true); socket.addEventListener(IOErrorEvent.IO_ERROR, ioErrorHandler, false); socket.addEventListener(IOErrorEvent.IO_ERROR, ioErrorHandler, true); - trace("registered event handling."); + if(is_debug){ trace("registered event handling."); } // ポリシーファイルの読み込み if(policy_file_protocol){ var url_load_policy_file:String; // url_load_policy_file = "xmlsocket://" + server_host + ":" + server_port; @@ -157,11 +162,12 @@ recv_do_timer.addEventListener(TimerEvent.TIMER, recv_do_callback); // イベントリスナーの発行 recv_do_timer.start(); // タイマーの作動開始 // 接続完了のときに接続完了をサーバーに通知するためのハートビート送信 var hb_id:String = make_heartbeat(); - this.send_action("_notice_heart_beat", { "_hb_id": hb_id}, true); // ハートビート送信 +// if(is_debug){ trace("DangoClientFramework:send _notice_heart_beat:" + hb_id + ":" + DangoUtil.now2str()); } + this.send_action("_notice_heart_beat", { "_hb_id": hb_id}); // ハートビート送信 } /** * connectHandler * 接続イベントの処理 @@ -333,29 +339,35 @@ crlf = receive_cache_byta.readUTFBytes(1); if(is_debug){ trace("DangoClientFramework:socket_read_push_cache:receive_encode_type=" + receive_encode_type); } if(is_debug){ trace("DangoClientFramework:socket_read_push_cache:receive_data_size=" + receive_data_size); } - // receive_cache_bytaの不要な部分を削除 - if(is_debug){ trace("DangoClientFramework:socket_read_push_cache:length=" + receive_cache_byta.length); } - if(is_debug){ trace("DangoClientFramework:socket_read_push_cache:position=" + receive_cache_byta.position); } + if(receive_data_size > send_recv_max_size){ throw new DangoError("recv data size is max size over. maybe data broken."); } + // receive_cache_bytaの不要な部分を削除 if(receive_cache_byta.length - receive_cache_byta.position > 0){ receive_cache_byta.readBytes(temp_byta, 0, receive_cache_byta.length - receive_cache_byta.position); receive_cache_byta = temp_byta; receive_cache_byta.position = 0; } else { receive_cache_byta = new ByteArray; } + if(is_debug){ trace("DangoClientFramework:socket_read_push_cache:receive_cache_do_phase == 0:end read:length=" + receive_cache_byta.length); } + receive_cache_do_phase = 1; // データ受信に行く + } catch(err:Error){ - this.dispatchEvent(new DangoErrorEvent("DangoError", DangoErrorCode.IOError, "failed in DangoClientFramework:socket_read_push_cache:receive_cache_do_phase == 0")); +// this.dispatchEvent(new DangoErrorEvent("DangoError", DangoErrorCode.IOError, "failed in DangoClientFramework:socket_read_push_cache:receive_cache_do_phase == 0")); + + // キャッシュに残っているデータを消して再度初めから受信できるようにする + trace("DangoClientFramework:socket_read_push_cache:receive_cache_do_phase==0:err=" + ObjectUtil.toString(err)); + receive_cache_do_phase = 0; // 長さから取得する + receive_cache_byta = new ByteArray; // キャッシュを空にする break; } - receive_cache_do_phase = 1; } // データ取得処理 if(receive_cache_do_phase == 1){ if(is_debug){ trace("DangoClientFramework:socket_read_push_cache:receive_cache_do_phase == 1:" + DangoUtil.now2str()); } @@ -369,12 +381,12 @@ // データのパースと実行待ち受信キャッシュにデータを入れる var ret_obj_data:Array; if(recv_data != "" && recv_data != "\n"){ // データが空じゃないならdecode ret_obj_data = JSON.decode(recv_data) as Array; for(var i:uint = 0; i < ret_obj_data.length; i++){ - var notice_name:String = ret_obj_data[i]["notice"]; - var recv_server_time:String = ret_obj_data[i]["server_time"]; + var notice_name:String = ret_obj_data[i]["_notice_name"]; + var recv_server_time:String = ret_obj_data[i]["_server_time"]; if(is_debug){ trace("DangoClientFramework:push recv_wait_do_cache:dango_" + notice_name + " i=" + i + " recv_server_time=" + recv_server_time); } recv_wait_do_cache.push([notice_name, ret_obj_data[i], recv_server_time, recv_do_count_no]); recv_do_count_no ++; if(is_debug){ trace("DangoClientFramework:pushed recv_wait_do_cache:recv_do_count_no=" + recv_do_count_no); } @@ -382,27 +394,30 @@ } else { // データが空なら空データを作ってreturn if(is_debug){ trace("DangoClientFramework:ret_obj_data is empty." + DangoUtil.now2str()); } } // receive_cache_bytaの不要な部分を削除 - if(is_debug){ trace("DangoClientFramework:socket_read_push_cache:length=" + receive_cache_byta.length); } - if(is_debug){ trace("DangoClientFramework:socket_read_push_cache:position=" + receive_cache_byta.position); } - if(receive_cache_byta.length - receive_cache_byta.position > 0){ receive_cache_byta.readBytes(temp_byta, 0, receive_cache_byta.length - receive_cache_byta.position); receive_cache_byta = temp_byta; receive_cache_byta.position = 0; } else { receive_cache_byta = new ByteArray; } if(is_debug){ trace("DangoClientFramework:socket_read_push_cache:receive_cache_do_phase == 1:end read:length=" + receive_cache_byta.length); } + receive_cache_do_phase = 0; // データ受信に行く + } catch(err:Error){ - this.dispatchEvent(new DangoErrorEvent("DangoError", DangoErrorCode.IOError, "failed in DangoClientFramework:socket_read_push_cache:receive_cache_do_phase == 1")); +// this.dispatchEvent(new DangoErrorEvent("DangoError", DangoErrorCode.IOError, "failed in DangoClientFramework:socket_read_push_cache:receive_cache_do_phase == 1")); + + // キャッシュに残っているデータを消して再度初めから受信できるようにする + trace("DangoClientFramework:socket_read_push_cache:receive_cache_do_phase==1:err=" + ObjectUtil.toString(err)); + receive_cache_do_phase = 0; // 長さから取得する + receive_cache_byta = new ByteArray; // キャッシュを空にする break; } - receive_cache_do_phase = 0; } } } @@ -427,10 +442,11 @@ server_time = recv_arr[2]; var count_no:uint = recv_arr[3]; if(notice_name == "_notice_sid"){ // 接続直後のsid通知なら this.sid = recv_data["_sid"]; + has_sid = true; if(is_debug){ trace("DangoClientFramework:this.sid=" + this.sid + " server_time=" + server_time); } } else { // 通常のデータならイベント発生 if(is_debug){ trace("DangoClientFramework:dispatchEvent:dango_" + notice_name + " server_time=" + server_time); } this.dispatchEvent(new DangoReceiveEvent("dango__before_filter", recv_data, count_no)); @@ -452,13 +468,10 @@ * @return void */ public function polling_callback(evt:TimerEvent):void { // if(is_debug){ trace("DangoClientFramework:polling_callback:" + DangoUtil.now2str() ); } if(socket.connected){ -// var send_obj:Object = null; -// this.send_data_to_server(send_obj); - var hb_id:String = make_heartbeat(); // if(is_debug){ trace("DangoClientFramework:send _notice_heart_beat:" + hb_id + ":" + DangoUtil.now2str()); } this.send_action("_notice_heart_beat", { "_hb_id": hb_id}); // ハートビート送信 } } @@ -481,21 +494,23 @@ * @return void */ public function delay_send_callback(evt:TimerEvent):void { // if(is_debug){ trace("DangoClientFramework:delay_send_callback:evt:" + evt); } if(!is_connect){ return(void); } - if(socket.connected){ - var send_obj_dup:Array; - var i:uint; + if(!socket.connected){ return(void); } + if(!has_sid){ return(void); } + + var send_obj_dup:Array; + var i:uint; + + for (i = 0; i < 5; i++) { + if(delay_send_cache.length == 0) { break; } - for (i = 0; i < 5; i++) { - if(delay_send_cache.length == 0) { break; } - send_obj_dup = delay_send_cache.shift(); - // データをすぐ送信 - this.send_data_to_server(send_obj_dup); - if(is_debug){ trace("DangoClientFramework:delay_send_callback:sent:" + DangoUtil.now2str()); } - } + // データをすぐ送信 + send_obj_dup = delay_send_cache.shift(); + this.send_data_to_server(send_obj_dup); + if(is_debug){ trace("DangoClientFramework:delay_send_callback:sent:" + send_obj_dup[0]["_action_name"] + ":" + has_sid + ":" + DangoUtil.now2str()); } } } /** * send data to server. @@ -505,20 +520,20 @@ * @param send_obj:Object * @param delay:Boolean=false * @return void */ public function send_action(action_name:String, send_obj:Object, delay:Boolean=false):void { - if(is_debug){ trace("DangoClientFramework:send_action:start:" + action_name + ":" + DangoUtil.now2str()); } + if(is_debug){ trace("DangoClientFramework:send_action:start:action_name=" + action_name + ":delay=" + delay + ":is_connect=" + is_connect + ":has_sid=" + has_sid + ":" + DangoUtil.now2str()); } -// if(!is_connect){ throw new DangoError("error:not connect" , 29); } // 接続されていない場合はエラー +// if(!is_connect){ throw new DangoError("error:not connect"); } // 接続されていない場合はエラー // 送信データの作成 var send_obj_dup:Object = ObjectUtil.copy(send_obj); - send_obj_dup["action"] = action_name; + send_obj_dup["_action_name"] = action_name; send_obj_dup["_return_id"] = (new Date()).time; // delayフラグがあったり、接続がまだなら、遅延送信用のキャッシュにデータを入れる - if(delay || !is_connect){ + if(delay || !is_connect || (action_name != "_notice_heart_beat" && !has_sid)){ delay_send_cache.push([send_obj_dup]); if(is_debug){ trace("DangoClientFramework:send_action:delay_pull:" + action_name + ":" + DangoUtil.now2str()); } return(void); }