dango 0.0.10 → 0.0.11

Sign up to get free protection for your applications and to get access to all the features.
@@ -60,7 +60,7 @@ class DangoClientFramework
60
60
  @log_level = @connection_client_log_level
61
61
 
62
62
  # loggerの準備
63
- cs_logger.debug("client initialize")
63
+ cs_logger.debug("-------client initialize")
64
64
 
65
65
  # データ送受信用の共有メモリ初期化
66
66
  send_receive_shared_init()
@@ -84,53 +84,59 @@ class DangoClientFramework
84
84
  @tmutex = Mutex.new # sockの排他処理用
85
85
  cs_logger.debug("addr:#{@sock.addr.inspect}")
86
86
 
87
+ @sid = nil # 接続して決まるsidを保持
88
+
87
89
  # データ受信用のスレッドの開始
88
90
  @thread_receive = Thread.start{ thread_main() }
89
91
  end
90
92
 
93
+ attr_reader(:sid)
94
+
91
95
  # データ受信用のスレッド処理
92
96
  def thread_main()
93
97
  catch(:session_closed) do
94
98
  loop do
95
99
  begin
96
100
  if @sock
97
- cs_logger.debug "start receive_data"
101
+ cs_logger.debug "#{@sid}:start receive_data"
98
102
  ret_obj = nil
99
103
  begin
100
104
  ret_obj = cs_receive_data(@sock) # データ受信処理
101
105
  rescue DangoFrameworkConnectionError
102
- cs_logger.debug "sock error:#{error_message($!, 'u')}"
106
+ cs_logger.debug "#{@sid}:sock error:#{error_message($!, 'u')}"
103
107
  throw(:session_closed)
104
108
  rescue DangoFrameworkError
105
- cs_logger.debug "sock error:#{error_message($!, 'u')}"
109
+ cs_logger.debug "#{@sid}:sock error:#{error_message($!, 'u')}"
106
110
  throw(:session_closed)
107
111
  end
108
- cs_logger.debug "finished cs_receive_data:#{ret_obj.inspect}"
112
+ cs_logger.debug "#{@sid}:finished cs_receive_data:#{ret_obj.inspect}"
109
113
 
110
114
  if !(ret_obj && ret_obj["notice"])
111
- cs_logger.info "no notice:#{ret_obj["notice"].inspect}"
115
+ cs_logger.info "#{@sid}:no notice:#{ret_obj["notice"].inspect}"
112
116
  end
113
117
 
114
118
  # メソッド呼び出し
115
- cs_logger.info "calling method=#{ret_obj["notice"].inspect}"
119
+ cs_logger.info "#{@sid}:calling method=#{ret_obj["notice"].inspect}"
116
120
  begin
117
121
  __send__("cs_receive_#{ret_obj["notice"]}", ret_obj)
118
122
  rescue
119
123
  cs_logger.error "error in cs_receive_#{ret_obj["notice"]}\n#{error_message($!, 'u')}"
124
+ ensure
125
+ # データの受信の送信返し
126
+ response_notice_name = "_response"
127
+ send_obj = {"_id" => ret_obj["_id"]}
128
+ cs_client_send_data(response_notice_name, send_obj)
129
+ cs_logger.debug "#{@sid}:response_notice_name=#{response_notice_name.inspect}"
120
130
  end
121
- cs_logger.debug "called method=#{ret_obj["notice"].inspect}"
131
+ cs_logger.debug "#{@sid}:called method=#{ret_obj["notice"].inspect}"
122
132
 
123
- # データの受信の送信返し
124
- response_notice_name = "_response"
125
- send_obj = {"_id" => ret_obj["_id"]}
126
- cs_client_send_data(response_notice_name, send_obj)
127
133
 
128
134
  else
129
135
  sleep 0.1
130
136
  end
131
137
 
132
138
  rescue Exception
133
- cs_logger.debug "#{error_message($!, 'u')}"
139
+ cs_logger.debug "#{@sid}:#{error_message($!, 'u')}"
134
140
  end
135
141
  end
136
142
  end
@@ -139,6 +145,11 @@ class DangoClientFramework
139
145
  end
140
146
  private :thread_main
141
147
 
148
+ # 接続直後のsid通知なら
149
+ def cs_receive__notice_sid(rec_obj)
150
+ @sid = rec_obj["_sid"]
151
+ end
152
+
142
153
  # ユーザーが終了させたい時に呼び出すメソッド(セッションを切る)
143
154
  def cs_client_close
144
155
  client_quit() # クライアントの終了処理
@@ -177,6 +188,7 @@ class DangoClientFramework
177
188
 
178
189
  # クライアントからサーバーへのデータ送信
179
190
  def cs_client_send_data(action_name, send_obj)
191
+ cs_logger.debug "cs_client_send_data(#{action_name.inspect}, #{send_obj['_id']}) #{Time.now}"
180
192
  send_obj_dup = send_obj.dup
181
193
  send_obj_dup["action"] = action_name.to_s
182
194
  cs_send_data(@sock, send_obj_dup)
@@ -188,7 +200,8 @@ class DangoClientFramework
188
200
  # return_nameは省略時は、action_nameの頭にreturnを付けたもののシンボルになる
189
201
  # timeoutは省略時は6秒
190
202
  def cs_client_send_receive_data(action_name, send_obj, options = {})
191
- cs_logger.debug "cs_client_send_receive_data(#{action_name.inspect}, #{send_obj.inspect}, #{options.inspect})"
203
+ # cs_logger.debug "cs_client_send_receive_data(#{action_name.inspect})"
204
+ # cs_logger.debug "cs_client_send_receive_data(#{action_name.inspect}, #{send_obj.inspect}, #{options.inspect})"
192
205
 
193
206
  return_name = options[:return_name] || ("return_" + action_name.to_s).to_sym
194
207
  timeout = options[:timeout] || 6
@@ -204,7 +217,7 @@ class DangoClientFramework
204
217
  instance_method_name = "cs_receive_#{return_name}"
205
218
  expr = <<-EOF
206
219
  def self.#{instance_method_name}(ret_obj)
207
- cs_logger.debug "ret_obj:" + ret_obj.inspect
220
+ # cs_logger.debug "ret_obj:" + ret_obj.inspect
208
221
  send_receive_shared[#{action_name_sym}] = ret_obj
209
222
  end
210
223
  EOF
@@ -40,16 +40,17 @@ class Object
40
40
  end
41
41
 
42
42
  # Timeクラスの表示形式修正
43
- #class Time
44
- # def to_s
45
- # self.strftime("%Y-%m-%d %H:%M:%S")
46
- # end
47
- #end
43
+ class Time
44
+ def to_s
45
+ self.strftime("%Y-%m-%d %H:%M:%S")
46
+ end
47
+ end
48
48
 
49
49
  # 例外定義
50
50
  class DangoFrameworkError < StandardError; end
51
51
  class DangoFrameworkTimeoutError < DangoFrameworkError; end
52
52
  class DangoFrameworkConnectionError < DangoFrameworkError; end
53
+ class DangoFrameworkReadNoDataError < DangoFrameworkError; end
53
54
  class DangoFrameworkFlashPolicyError < DangoFrameworkError; end
54
55
 
55
56
  # エラー出力用モジュール
@@ -76,7 +77,7 @@ module DangoUtilModule
76
77
  # arrは順番を入れ替えたい配列
77
78
  # numは入れ替え回数(省略時2、大きな数を入れると確実にランダムになるが時間が掛かる)
78
79
  def array_random(arr, num = 2)
79
- arr.sort_by{rand}.deep_dup
80
+ arr.sort_by{rand}.deep_dup
80
81
 
81
82
  # ret_arr = arr.deep_dup
82
83
  # (ret_arr.size * num).times do # メンバー数のnum倍の回数、入れ替え
@@ -142,9 +143,11 @@ module DangoFrameworkModule
142
143
  raise(DangoFrameworkConnectionError, "failed to read sock.\n#{error_message($!, 'u')}")
143
144
  end
144
145
 
146
+ raise(DangoFrameworkReadNoDataError, "sid=#{Thread.current.object_id}:size_str=#{size_str.inspect}") if size_str == ""
147
+
145
148
  dtype, size = size_str[0, 5].unpack("cN")
146
149
 
147
- raise(DangoFrameworkConnectionError, "size=#{size}:size_str=#{size_str.inspect}") if size == nil || size == 0
150
+ raise(DangoFrameworkConnectionError, "sid=#{Thread.current.object_id}:size=#{size}:size_str=#{size_str.inspect}") if size == nil || size == 0
148
151
 
149
152
  ## Flash のpolicyファイルだった場合(特殊)
150
153
  if size == 1886350441
@@ -158,7 +161,7 @@ module DangoFrameworkModule
158
161
  end
159
162
  end
160
163
 
161
- cs_logger.debug "size=#{size}:size_str=#{size_str.inspect}"
164
+ # cs_logger.debug "size=#{size}:size_str=#{size_str.inspect}"
162
165
 
163
166
  ret_data_orig = ""
164
167
 
@@ -179,7 +182,7 @@ module DangoFrameworkModule
179
182
  # cs_logger.debug "size:#{size.inspect}"
180
183
  end
181
184
 
182
- cs_logger.debug "ret_data_orig:#{ret_data_orig.inspect}"
185
+ # cs_logger.debug "ret_data_orig:#{ret_data_orig.inspect}"
183
186
 
184
187
  ret_data = cs_receive_decrypt(ret_data_orig[0..-2])
185
188
 
@@ -176,14 +176,20 @@ class DangoServerFramework
176
176
 
177
177
  begin
178
178
  session[:session_id] = Thread.current.object_id
179
- socket_list.add(session[:session_id], sock)
180
- mutex_socket_list.add(session[:session_id])
179
+ session_id = session[:session_id]
180
+ socket_list.add(session_id, sock)
181
+ mutex_socket_list.add(session_id)
181
182
 
182
183
  sock.binmode
183
184
  sock.sync = true
184
185
 
185
186
  cs_connect() # 接続時メソッド呼び出し
186
187
 
188
+ # 接続直後のsid通知
189
+ session_id = session_id
190
+ send_obj = {"_sid"=>session_id}
191
+ cs_server_send_data(session_id, "_notice_sid", send_obj)
192
+
187
193
  # メインループ入り
188
194
  loop do
189
195
  if sock.closed?
@@ -214,19 +220,23 @@ class DangoServerFramework
214
220
 
215
221
  # アクション名
216
222
  action_name = ret_obj["action"].to_s
217
- cs_logger.debug "action_name=#{action_name}"
218
223
 
219
224
  @mutex_proc_thread.synchronize do
220
225
 
221
226
  if action_name == '_response' # 送信パケットの返事なら
227
+ # cs_logger.debug "action_name=#{action_name} #{Time.now}"
222
228
  action_name_is_response(ret_obj)
229
+
223
230
  elsif action_name == 'monitor_all_info' # メンテナンスアクション名なら
224
231
  cs_check_monitor_error(sock, "return_monitor_all_info")
225
232
  cs_server_monitor_all_info()
233
+
226
234
  elsif action_name == 'monitor_server_reload' # メンテナンスアクション名なら
227
235
  cs_check_monitor_error(sock, "return_monitor_server_reload")
228
236
  cs_server_monitor_server_reload()
237
+
229
238
  else # メンテナンスコマンド以外のユーザーアクション名なら
239
+ cs_logger.debug "action_name=#{action_name} #{Time.now}"
230
240
  begin
231
241
  __send__("cs_receive_#{action_name}", ret_obj)
232
242
  rescue NoMethodError
@@ -239,18 +249,21 @@ class DangoServerFramework
239
249
  end
240
250
  end
241
251
 
252
+ rescue DangoFrameworkReadNoDataError
253
+ cs_logger.debug "read no data. maybe client closed. #{Thread.current.object_id} #{Time.now}"
254
+
242
255
  rescue DangoFrameworkConnectionError
243
256
  @recv_fail_count += 1 if @recv_fail_count # 受信失敗回数カウント
244
- cs_logger.debug "connection error. \n#{error_message($!, 'u')}"
257
+ cs_logger.debug "connection error. #{Thread.current.object_id} #{Time.now}\n#{error_message($!, 'u')}"
245
258
 
246
259
  rescue DangoFrameworkError
247
- cs_logger.debug "DangoFrameworkError. \n#{error_message($!, 'u')}"
260
+ cs_logger.debug "DangoFrameworkError. #{Thread.current.object_id} #{Time.now}\n#{error_message($!, 'u')}"
248
261
 
249
262
  rescue Exception
250
- cs_logger.error "#{error_message($!, 'u')}"
263
+ cs_logger.error "Exception #{Thread.current.object_id} #{Time.now} #{error_message($!, 'u')}"
251
264
 
252
265
  ensure
253
- cs_logger.debug "#{sock.inspect} is gone"
266
+ cs_logger.debug "#{sock.inspect} #{Thread.current.object_id} is gone"
254
267
 
255
268
  @mutex_proc_thread.synchronize do
256
269
  begin
@@ -261,7 +274,7 @@ class DangoServerFramework
261
274
  socket_list.delete(Thread.current.object_id) # ソケットリストから削除
262
275
  sock.close # ソケットを閉じる
263
276
 
264
- cs_logger.debug "#{sock.inspect} is gone 2"
277
+ cs_logger.debug "#{sock.inspect} #{Thread.current.object_id} is gone 2"
265
278
  end
266
279
  end
267
280
 
@@ -5,12 +5,14 @@
5
5
  =end
6
6
 
7
7
  require 'dango/client_framework' # コネクションクライアントフレームワークの呼び出し
8
+ require 'thread'
8
9
 
9
10
  # テスタークラス
10
11
  class DangoTesterClient
11
12
  # テスターのイニシャライズ
12
13
  def initialize
13
14
  @client_conns = {}
15
+ Thread.abort_on_exception = true
14
16
  end
15
17
 
16
18
  # クライアントを1個接続
@@ -24,7 +26,7 @@ class DangoTesterClient
24
26
  env = "development"
25
27
 
26
28
  # 接続
27
- client_conn = TestClient.new(env, config)
29
+ client_conn = TestClient.new(env, config, c_name)
28
30
 
29
31
  # client_nameメソッド作成とclient_nameを定義
30
32
  client_conn.client_name = c_name
@@ -42,17 +44,16 @@ end
42
44
  # テスト接続用のクラス
43
45
  class TestClient < DangoClientFramework
44
46
  SendReceiveSleepIntervalSec = 0.1 # データ送信後の順の際のタイムアウトチェック間隔秒
45
- SendReceiveTimeoutSec = 5 # データ送信後の順の際のタイムアウトチェック間隔秒
47
+ SendReceiveTimeoutSec = 10 # データ送信後の順の際のタイムアウトチェック間隔秒
46
48
 
47
- def initialize(env, config)
49
+ def initialize(env, config, c_name)
48
50
  @config = config
51
+ @client_name = c_name # クライアント名
52
+
49
53
  super(env, config)
50
54
 
51
55
  @receive_mutex = Mutex.new # 送受信用の排他処理
52
56
  @receive_arr = []
53
- @receive_defined_names = []
54
-
55
- @client_name = nil # クライアント名
56
57
 
57
58
  send_receive_shared_init()
58
59
  end
@@ -72,7 +73,7 @@ class TestClient < DangoClientFramework
72
73
  @connection_client_port = @config["network"]["port"] # 自動でこのポートでサーバー開始
73
74
 
74
75
  # ログ出力情報
75
- @connection_client_log_file = "log/lt_client_base.log" # 自動でこのログファイル名を使う
76
+ @connection_client_log_file = "log/tester_#{@client_name}.log" # 自動でこのログファイル名を使う
76
77
  @connection_client_log_level = Logger::DEBUG # 自動でこのログレベルになる
77
78
  end
78
79
 
@@ -82,12 +83,11 @@ class TestClient < DangoClientFramework
82
83
  cs_client_send_data(name, send_obj)
83
84
  end
84
85
 
85
- # make_receive_stack
86
- def make_receive_stack(receive_name, options = {})
86
+ # trap_receive_data
87
+ def trap_receive_data(receive_name, options = {})
88
+ cs_logger.debug "trap_receive_data:#{receive_name}:#{Time.now}"
87
89
  timeout = options[:timeout] || SendReceiveTimeoutSec
88
90
 
89
- @receive_defined_names.push(receive_name)
90
-
91
91
  Thread.start do
92
92
  send_receive_shared[receive_name] = nil
93
93
  end_reserved_time = Time.now + timeout
@@ -119,10 +119,11 @@ class TestClient < DangoClientFramework
119
119
  end
120
120
 
121
121
  if !send_receive_shared[receive_name] # 戻ってきたデータがあるかどうかチェック
122
- raise(DangoFrameworkError, "received data is none")
122
+ raise(DangoFrameworkError, "received data is none. sid=#{sid} receive_name=#{receive_name}")
123
123
  end
124
124
 
125
125
  @receive_mutex.synchronize do
126
+ cs_logger.debug "receive_name:#{receive_name}:#{send_receive_shared[receive_name].inspect}"
126
127
  @receive_arr.push([receive_name, send_receive_shared[receive_name]])
127
128
  # p @receive_arr
128
129
  end
data/lib/dango/version.rb CHANGED
@@ -2,7 +2,7 @@ module Dango #:nodoc:
2
2
  module VERSION #:nodoc:
3
3
  MAJOR = 0
4
4
  MINOR = 0
5
- TINY = 10
5
+ TINY = 11
6
6
 
7
7
  STRING = [MAJOR, MINOR, TINY].join('.')
8
8
  end
metadata CHANGED
@@ -3,8 +3,8 @@ rubygems_version: 0.9.4
3
3
  specification_version: 1
4
4
  name: dango
5
5
  version: !ruby/object:Gem::Version
6
- version: 0.0.10
7
- date: 2007-10-15 00:00:00 +09:00
6
+ version: 0.0.11
7
+ date: 2007-10-16 00:00:00 +09:00
8
8
  summary: Ruby - Flash conneciton network flamework
9
9
  require_paths:
10
10
  - lib