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);
}