dango_generator 0.2.5 → 0.2.6
Sign up to get free protection for your applications and to get access to all the features.
@@ -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
|
|