dango_generator 0.2.5 → 0.2.6
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -30,12 +30,7 @@ package org.rubyforge.dango {
|
|
30
30
|
private var is_debug:Boolean; // Debugモードかどうかのフラグ
|
31
31
|
private var is_connect:Boolean = false; // 接続完了しているかどうか
|
32
32
|
|
33
|
-
private var receve_count:uint = 0; // データ受信回数
|
34
33
|
private var frame_rate:uint = 24; // デフォルトのフレームレート(想定値)
|
35
|
-
private var receive_cache:Array = []; // 受信データの一時保管用のキャッシュ
|
36
|
-
|
37
|
-
private var recv_not_yet_size:uint = 0; // データ受信時のキャッシュサイズ
|
38
|
-
private var recv_not_yet_str:String = ""; // データ受信時のキャッシュデータ
|
39
34
|
|
40
35
|
private var polling_timer:Timer; // ポーリング(ハートビート)用タイマーの設定
|
41
36
|
private var polling_timer_msec:uint = 5000; // ポーリング(ハートビート)用タイマーのミリ秒
|
@@ -44,9 +39,20 @@ package org.rubyforge.dango {
|
|
44
39
|
private var delay_send_timer_msec:uint = 1500; // 遅延送信用のタイマーのミリ秒
|
45
40
|
private var delay_send_cache:Array = []; // 遅延送信用のキャッシュ
|
46
41
|
|
47
|
-
private var
|
48
|
-
private var
|
49
|
-
|
42
|
+
private var receve_count:uint = 0; // データ受信回数
|
43
|
+
private var receive_row_cache:Array = []; // 受信データの一時保管用のキャッシュ
|
44
|
+
|
45
|
+
private var recv_not_yet_size:uint = 0; // データ受信時のキャッシュサイズ
|
46
|
+
private var recv_not_yet_str:String = ""; // データ受信時のキャッシュデータ
|
47
|
+
|
48
|
+
private var recv_wait_do_cache:Array = []; // 実行待ち受信キャッシュ
|
49
|
+
private var recv_cache_timer_msec:uint; // 受信キャッシュ用タイマーの実行間隔
|
50
|
+
private var recv_cache_timer:Timer; // 受信キャッシュ用タイマーの追加
|
51
|
+
|
52
|
+
private var recv_do_count_no:uint = 0; // 受信実行の回数
|
53
|
+
private var recv_do_timer_msec:uint; // 受信実行用タイマーの実行間隔
|
54
|
+
private var recv_do_timer:Timer; // 受信実行用タイマーの追加
|
55
|
+
private var recv_do_last_date:Date = new Date(); // 受信キャッシュ用処理落ちチェック用
|
50
56
|
|
51
57
|
public var server_time:String = ""; // サーバーの時計
|
52
58
|
|
@@ -136,12 +142,19 @@ package org.rubyforge.dango {
|
|
136
142
|
delay_send_timer.addEventListener(TimerEvent.TIMER, delay_send_callback); // イベントリスナーの発行
|
137
143
|
delay_send_timer.start(); // タイマーの作動開始
|
138
144
|
|
139
|
-
//
|
140
|
-
|
141
|
-
if(is_debug){ trace("DangoClientFramework:
|
142
|
-
|
143
|
-
|
144
|
-
|
145
|
+
// 受信キャッシュ用タイマーの設定(4フレームごとに動かすよう変更)
|
146
|
+
recv_cache_timer_msec = uint((1000 * 4) / frame_rate);
|
147
|
+
if(is_debug){ trace("DangoClientFramework:recv_cache_timer_msec:" + recv_cache_timer_msec); }
|
148
|
+
recv_cache_timer = new Timer(recv_cache_timer_msec, 0); // タイマーの追加
|
149
|
+
recv_cache_timer.addEventListener(TimerEvent.TIMER, recv_cache_callback); // イベントリスナーの発行
|
150
|
+
recv_cache_timer.start(); // タイマーの作動開始
|
151
|
+
|
152
|
+
// 受信実行用タイマーの設定(2フレームごとに動かすよう変更)
|
153
|
+
recv_do_timer_msec = uint((1000 * 2) / frame_rate);
|
154
|
+
if(is_debug){ trace("DangoClientFramework:recv_do_timer_msec:" + recv_do_timer_msec); }
|
155
|
+
recv_do_timer = new Timer(recv_do_timer_msec, 0); // タイマーの追加
|
156
|
+
recv_do_timer.addEventListener(TimerEvent.TIMER, recv_do_callback); // イベントリスナーの発行
|
157
|
+
recv_do_timer.start(); // タイマーの作動開始
|
145
158
|
|
146
159
|
// 接続完了のときに接続完了をサーバーに通知するためのハートビート送信
|
147
160
|
var hb_id:String = make_heartbeat();
|
@@ -189,37 +202,6 @@ package org.rubyforge.dango {
|
|
189
202
|
this.dispatchEvent(new DangoErrorEvent("DangoError", DangoErrorCode.IOError, msg));
|
190
203
|
}
|
191
204
|
|
192
|
-
/*
|
193
|
-
//プログレスイベントの処理(呼び出し用イベントのディスパッチ)
|
194
|
-
private function socketDataHandler(evt:ProgressEvent):void {
|
195
|
-
receve_count ++;
|
196
|
-
if(is_debug){ trace("DangoClientFramework:socketDataHandler:" + receve_count); }
|
197
|
-
var receive_data:Object = this.receive_notice();
|
198
|
-
|
199
|
-
if(recv_not_yet_size == 0){ // 未受信データが無ければ
|
200
|
-
if(receive_data != {}){ // データが空なら無視する
|
201
|
-
var notice_name:String = receive_data["notice"];
|
202
|
-
|
203
|
-
if(notice_name == "_notice_sid"){ // 接続直後のsid通知なら
|
204
|
-
this.sid = receive_data["_sid"];
|
205
|
-
// if(is_debug){ trace("DangoClientFramework:this.sid=" + this.sid + ":" + DangoUtil.now2str()); }
|
206
|
-
if(is_debug){ trace("DangoClientFramework:this.sid=" + this.sid + ":" + receve_count); }
|
207
|
-
|
208
|
-
} else if(notice_name == "_heart_beat"){ // heart beat通知なら
|
209
|
-
if(is_debug){ trace("DangoClientFramework:_heart_beat:" + receve_count); }
|
210
|
-
|
211
|
-
} else { // 通常のデータならイベント発生
|
212
|
-
if(is_debug){ trace("DangoClientFramework:dispatchEvent:dango_" + notice_name + ":" + receve_count); }
|
213
|
-
this.dispatchEvent(new DangoReceiveEvent("dango_" + notice_name, receive_data));
|
214
|
-
}
|
215
|
-
} else { // データが空なら
|
216
|
-
// if(is_debug){ trace("DangoClientFramework:receive_data is empty." + DangoUtil.now2str()); }
|
217
|
-
if(is_debug){ trace("DangoClientFramework:receive_data is empty."); }
|
218
|
-
}
|
219
|
-
}
|
220
|
-
}
|
221
|
-
*/
|
222
|
-
|
223
205
|
// プログレスイベントの処理(呼び出し用イベントのディスパッチ)
|
224
206
|
// とにかくキャッシュに入れるだけ
|
225
207
|
private function socketDataHandler(evt:ProgressEvent):void {
|
@@ -227,7 +209,7 @@ package org.rubyforge.dango {
|
|
227
209
|
if(is_debug){ trace("DangoClientFramework:socketDataHandler:" + receve_count + ":start:" + DangoUtil.now2str()); }
|
228
210
|
var byte_array:ByteArray = new ByteArray;
|
229
211
|
socket.readBytes(byte_array, 0, socket.bytesAvailable);
|
230
|
-
|
212
|
+
receive_row_cache.push([byte_array, receve_count]);
|
231
213
|
}
|
232
214
|
|
233
215
|
// Event送出用
|
@@ -253,64 +235,78 @@ package org.rubyforge.dango {
|
|
253
235
|
|
254
236
|
|
255
237
|
/**
|
256
|
-
*
|
257
|
-
*
|
238
|
+
* recv_cache_callback
|
239
|
+
* 受信データの再構成とキャッシュをする
|
258
240
|
*
|
259
241
|
* @param evt:TimerEvent
|
260
242
|
* @return void
|
261
243
|
*/
|
262
|
-
public function
|
263
|
-
// if(is_debug){ trace("DangoClientFramework:
|
244
|
+
public function recv_cache_callback(evt:TimerEvent):void {
|
245
|
+
// if(is_debug){ trace("DangoClientFramework:recv_cache_callback:" + DangoUtil.now2str()); }
|
246
|
+
|
247
|
+
if(receive_row_cache.length > 0){
|
248
|
+
if(is_debug){ trace("DangoClientFramework:recv_cache_callback:receive_row_cache.length=" + receive_row_cache.length + ":" + DangoUtil.now2str()); }
|
249
|
+
var arr:Array = receive_row_cache.shift(); // Queueとして取り出し
|
250
|
+
var byte_array:ByteArray = arr[0];
|
251
|
+
var recv_c:uint = arr[1];
|
252
|
+
// if(is_debug){ trace("DangoClientFramework:recv_c=" + recv_c); }
|
253
|
+
var receive_data:Array = this.parse_notice(byte_array);
|
254
|
+
|
255
|
+
if(recv_not_yet_size == 0){ // 未受信データが無ければ、ひとつのデータ受信が完了とみなす
|
256
|
+
if(receive_data != []){ // データが空じゃなければ処理開始
|
257
|
+
for(var i:uint = 0; i < receive_data.length; i++){
|
258
|
+
var notice_name:String = receive_data[i]["notice"];
|
259
|
+
var recv_server_time:String = receive_data[i]["server_time"];
|
260
|
+
|
261
|
+
if(is_debug){ trace("DangoClientFramework:push recv_wait_do_cache:dango_" + notice_name + ": recv_c:" + recv_c + ":" + i + " recv_server_time:" + recv_server_time); }
|
262
|
+
recv_wait_do_cache.push([notice_name, receive_data[i], recv_server_time, recv_do_count_no]);
|
263
|
+
|
264
|
+
recv_do_count_no ++;
|
265
|
+
}
|
266
|
+
} else { // データが空なら
|
267
|
+
// if(is_debug){ trace("DangoClientFramework:receive_data is empty." + DangoUtil.now2str()); }
|
268
|
+
if(is_debug){ trace("DangoClientFramework:receive_data is empty."); }
|
269
|
+
}
|
270
|
+
}
|
271
|
+
}
|
272
|
+
}
|
273
|
+
|
274
|
+
/**
|
275
|
+
* recv_do_callback
|
276
|
+
* 受信データの実行する処理
|
277
|
+
*
|
278
|
+
* @param evt:TimerEvent
|
279
|
+
* @return void
|
280
|
+
*/
|
281
|
+
public function recv_do_callback(evt:TimerEvent):void {
|
282
|
+
// if(is_debug){ trace("DangoClientFramework:recv_do_callback:" + DangoUtil.now2str()); }
|
264
283
|
|
265
284
|
// 前回から時間がかかりすぎている(処理落ちしかけている場合は)スキップ
|
266
285
|
var start_date:Date = new Date();
|
267
|
-
|
268
|
-
|
269
|
-
|
270
|
-
|
271
|
-
|
272
|
-
|
273
|
-
var
|
274
|
-
var recv_c:uint = arr[1];
|
275
|
-
if(is_debug){ trace("DangoClientFramework:recv_c=" + recv_c); }
|
276
|
-
var receive_data:Array = this.receive_notice(byte_array);
|
277
|
-
|
278
|
-
if(recv_not_yet_size == 0){ // 未受信データが無ければ、ひとつのデータ受信が完了とみなす
|
279
|
-
if(receive_data != []){ // データが空じゃなければ処理開始
|
280
|
-
for(var i:uint = 0; i < receive_data.length; i++){
|
281
|
-
var notice_name:String = receive_data[i]["notice"];
|
282
|
-
server_time = receive_data[i]["server_time"];
|
283
|
-
|
284
|
-
if(notice_name == "_notice_sid"){ // 接続直後のsid通知なら
|
285
|
-
this.sid = receive_data[i]["_sid"];
|
286
|
-
if(is_debug){ trace("DangoClientFramework:this.sid=" + this.sid + " recv_c:" + recv_c + " server_time:" + server_time); }
|
287
|
-
|
288
|
-
} else { // 通常のデータならイベント発生
|
289
|
-
if(is_debug){ trace("DangoClientFramework:dispatchEvent:dango_" + notice_name + ": recv_c:" + recv_c + ":" + i + " server_time:" + server_time); }
|
290
|
-
this.dispatchEvent(new DangoReceiveEvent("dango_" + notice_name, receive_data[i]));
|
291
|
-
}
|
292
|
-
}
|
293
|
-
} else { // データが空なら
|
294
|
-
// if(is_debug){ trace("DangoClientFramework:receive_data is empty." + DangoUtil.now2str()); }
|
295
|
-
if(is_debug){ trace("DangoClientFramework:receive_data is empty."); }
|
296
|
-
}
|
297
|
-
}
|
286
|
+
if(recv_do_last_date.time > start_date.time - (Number(recv_do_timer_msec) * 1.3)){
|
287
|
+
if(recv_wait_do_cache.length > 0){
|
288
|
+
var recv_arr:Array = recv_wait_do_cache.shift();
|
289
|
+
var notice_name:String = recv_arr[0];
|
290
|
+
var recv_data:Object = recv_arr[1];
|
291
|
+
server_time = recv_arr[2];
|
292
|
+
var count_no:uint = recv_arr[3];
|
298
293
|
|
299
|
-
|
300
|
-
|
301
|
-
|
302
|
-
|
303
|
-
|
304
|
-
if(is_debug){ trace("DangoClientFramework:
|
305
|
-
|
294
|
+
if(notice_name == "_notice_sid"){ // 接続直後のsid通知なら
|
295
|
+
this.sid = recv_data["_sid"];
|
296
|
+
if(is_debug){ trace("DangoClientFramework:this.sid=" + this.sid + " server_time=" + server_time); }
|
297
|
+
|
298
|
+
} else { // 通常のデータならイベント発生
|
299
|
+
if(is_debug){ trace("DangoClientFramework:dispatchEvent:dango_" + notice_name + " server_time=" + server_time); }
|
300
|
+
this.dispatchEvent(new DangoReceiveEvent("dango__before_filter", recv_data, count_no));
|
301
|
+
this.dispatchEvent(new DangoReceiveEvent("dango_" + notice_name, recv_data, count_no));
|
306
302
|
}
|
307
|
-
*/
|
308
303
|
}
|
309
304
|
}
|
310
305
|
|
311
|
-
|
306
|
+
recv_do_last_date = new Date(); // 前回の実行の終了時間の保持
|
312
307
|
}
|
313
308
|
|
309
|
+
|
314
310
|
/**
|
315
311
|
* polling_callback
|
316
312
|
* ハートビート用タイマーコールバック
|
@@ -357,7 +353,7 @@ package org.rubyforge.dango {
|
|
357
353
|
|
358
354
|
for (i = 0; i < 5; i++) {
|
359
355
|
if(delay_send_cache.length == 0) { break; }
|
360
|
-
send_obj_dup = delay_send_cache.
|
356
|
+
send_obj_dup = delay_send_cache.shift();
|
361
357
|
// データをすぐ送信
|
362
358
|
this.send_data_to_server(send_obj_dup);
|
363
359
|
if(is_debug){ trace("DangoClientFramework:delay_send_callback:sent:" + DangoUtil.now2str()); }
|
@@ -439,12 +435,12 @@ package org.rubyforge.dango {
|
|
439
435
|
|
440
436
|
/**
|
441
437
|
* receive data from server.
|
442
|
-
*
|
438
|
+
* データ受信のデータのパースなど
|
443
439
|
*
|
444
440
|
* @return Object
|
445
441
|
*/
|
446
|
-
public function
|
447
|
-
if(is_debug){ trace("DangoClientFramework:
|
442
|
+
public function parse_notice(byte_array:ByteArray):Array {
|
443
|
+
if(is_debug){ trace("DangoClientFramework:parse_notice:" + DangoUtil.now2str()); }
|
448
444
|
|
449
445
|
// 変数定義
|
450
446
|
var recv_data_orig:String = "";
|
@@ -533,5 +529,15 @@ package org.rubyforge.dango {
|
|
533
529
|
}
|
534
530
|
}
|
535
531
|
|
532
|
+
/**
|
533
|
+
* dango_before_filter の雛形
|
534
|
+
* すべてのdango通知の前処理用のメソッド
|
535
|
+
* over writeすべし
|
536
|
+
*
|
537
|
+
* @param evt:DangoReceiveEvent
|
538
|
+
* @return void
|
539
|
+
protected function dango__before_filter(evt:Object):void {
|
540
|
+
}
|
541
|
+
*/
|
536
542
|
}
|
537
543
|
}
|
@@ -5,17 +5,21 @@ package org.rubyforge.dango {
|
|
5
5
|
public class DangoReceiveEvent extends Event {
|
6
6
|
private var dango_type:String;
|
7
7
|
public var receive_data:Object;
|
8
|
+
public var receive_count_no:uint;
|
8
9
|
|
9
|
-
public function DangoReceiveEvent(type:String,
|
10
|
+
public function DangoReceiveEvent(type:String,
|
11
|
+
receive_data_orig:Object,
|
12
|
+
receive_count_no_orig:uint,
|
10
13
|
bubbles:Boolean = false,
|
11
14
|
cancelable:Boolean = false) {
|
12
15
|
dango_type = type;
|
13
16
|
receive_data = receive_data_orig;
|
17
|
+
receive_count_no = receive_count_no_orig;
|
14
18
|
super(type, bubbles, cancelable);
|
15
19
|
}
|
16
20
|
|
17
21
|
public override function clone():Event {
|
18
|
-
return(new DangoReceiveEvent(dango_type, receive_data));
|
22
|
+
return(new DangoReceiveEvent(dango_type, receive_data, receive_count_no));
|
19
23
|
}
|
20
24
|
}
|
21
25
|
}
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: dango_generator
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.2.
|
4
|
+
version: 0.2.6
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Keisuke Minami
|
@@ -9,7 +9,7 @@ autorequire:
|
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
11
|
|
12
|
-
date: 2008-
|
12
|
+
date: 2008-06-15 00:00:00 +09:00
|
13
13
|
default_executable:
|
14
14
|
dependencies: []
|
15
15
|
|