Class: DangoClientFramework
- Includes:
- DangoFrameworkModule
- Defined in:
- lib/dango/client_framework.rb
Overview
フレームワーククラス
Direct Known Subclasses
Defined Under Namespace
Classes: ClientNoticeShared
Constant Summary collapse
- SendReceiveSleepIntervalSec =
データ送信後の順の際のタイムアウトチェック間隔秒
0.1
- HeartBeatSendIntervalSec =
ハートビート送信の間隔秒
5.0
Constants included from DangoFrameworkModule
DangoFrameworkModule::CommMaxDigit, DangoFrameworkModule::DefaultEncodeType, DangoFrameworkModule::EncodeTypeJSON, DangoFrameworkModule::EncodeTypeMarshal, DangoFrameworkModule::EncodeTypeYAML, DangoFrameworkModule::MaxLenRecv, DangoFrameworkModule::MaxLenSend, DangoFrameworkModule::ReadTimeoutSec
Instance Attribute Summary collapse
-
#sid ⇒ Object
readonly
Returns the value of attribute sid.
Attributes included from DangoFrameworkModule
Instance Method Summary collapse
-
#dango_client_close ⇒ Object
ユーザーが終了させたい時に呼び出すメソッド(セッションを切る).
-
#dango_client_init ⇒ Object
起動処理.
-
#dango_client_notice_shared ⇒ Object
通知共有メモリ.
-
#dango_client_notice_shared_init ⇒ Object
通知共有メモリの初期化.
-
#dango_client_receive_decrypt(str) ⇒ Object
クライアントの復号化処理.
-
#dango_client_send_encrypt(str) ⇒ Object
クライアントの暗号化処理.
-
#dango_heart_beat_thread_init ⇒ Object
ハートビート送信スレッドの起動.
-
#dango_receive__heart_beat(rec_obj) ⇒ Object
ハートビートなら.
-
#dango_receive__notice_sid(rec_obj) ⇒ Object
接続直後のsid通知なら.
-
#dango_receive__notice_system_message(rec_obj) ⇒ Object
システムからのメッセージ通知なら.
-
#dango_receive_decrypt(str) ⇒ Object
フレームワークから呼ばれる部分.
-
#dango_send_encrypt(str) ⇒ Object
フレームワークから呼ばれる部分.
-
#dango_session_closed ⇒ Object
セッションが切れると呼ばれる処理.
-
#initialize(env, config = nil) ⇒ DangoClientFramework
constructor
メイン処理.
-
#method_missing(name, *args) ⇒ Object
必要に応じて追加するメソッド.
-
#send_action(action_name, send_obj) ⇒ Object
クライアントからサーバーへのデータ送信.
-
#send_action_return_notice(action_name, send_obj, options = {}) ⇒ Object
サーバーからクライアントへのデータ送信 自動でreturn_nameに対応したdango_receive_メソッドが出来上がるので注意 options = {:return_name=> :timeout => } return_nameは省略時は、action_nameの頭にreturnを付けたもののシンボルになる timeoutは省略時は6秒.
- #send_return_shared ⇒ Object
-
#send_return_shared_init ⇒ Object
send_action_return_notice用の共有メモリ.
Methods included from DangoFrameworkModule
#dango_receive_data, #dango_send_data, #debug_print, #error_print, #logger
Methods included from ErrorMessage
Constructor Details
#initialize(env, config = nil) ⇒ DangoClientFramework
メイン処理
34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 |
# File 'lib/dango/client_framework.rb', line 34 def initialize(env, config = nil) if !config config = YAML.load(open("#{RAILS_ROOT}/config/dango/#{env}.yml", "rb"){|fh| fh.read}) end @config = config # 変数の初期設定 @connection_client_host = @config['network']['host'] || 'localhost' @connection_client_port = @config['network']['port'] || 15000 @connection_client_log_file = "" # 未定義時にこのログファイル名を使う # @connection_client_log_level = Logger::DEBUG # 未定義時にこのログレベルになる @connection_client_log_level = Logger::INFO # 未定義時にこのログレベルになる @connection_client_log_max_size = 1048576 # 未定義時にこのログレベルになる @connection_client_log_shift_age = 99 # 未定義時にこのログレベルになる @connection_encode_type = EncodeTypeMarshal @recv_count = 0 # 受信回数 @send_count = 0 # 送信回数 Signal.trap('INT') do # SIGINT を捕捉する。 puts "shutdown" # exit exit! end begin dango_client_init() # 初期設定読み込み rescue = "failed in dango_client_init. #{($!, 'u')}" logger.error raise DangoFrameworkException, end @log_file = @connection_client_log_file @log_level = @connection_client_log_level @log_max_size = @connection_client_log_max_size @log_shift_age = @connection_client_log_shift_age # loggerの準備 logger.debug("-------client initialize host=#{@connection_client_host} port=#{@connection_client_port}") logger.info("@log_file = #{@log_file}") logger.info("@log_level = #{@log_level}") logger.info("@log_max_size = #{@log_max_size}") logger.info("@log_shift_age = #{@log_shift_age}") # データ送受信用の共有メモリ初期化 send_return_shared_init() @send_receive_mutex = Mutex.new # 送受信用の排他処理 # 通知共有メモリの初期化 dango_client_notice_shared_init() # ソケットの準備 @sock = nil @is_close = false # サーバーへ接続 begin @sock = TCPSocket.new(@connection_client_host, @connection_client_port) rescue Errno::EBADF, Exception raise DangoFrameworkConnectionException end @sock.binmode @sock.sync = true logger.debug("addr:#{@sock.addr.inspect}") @tmutex = Mutex.new # sockの排他処理用 dango_heart_beat_thread_init() # ハートビート送信スレッドの起動 @sid = nil # 接続して決まるsidを保持 # データ受信用のスレッドの開始 @thread_receive = Thread.start{ thread_main() } # エンコードタイプ変更を送信 send_obj = {"encode_type" => @connection_encode_type} send_action("_change_encode_type", send_obj) logger.info "_change_encode_type=#{@connection_encode_type.inspect}" end |
Dynamic Method Handling
This class handles dynamic methods through the method_missing method
#method_missing(name, *args) ⇒ Object
必要に応じて追加するメソッド
213 214 215 216 |
# File 'lib/dango/client_framework.rb', line 213 def method_missing(name, *args) logger.info "method not found. #{name.inspect} #{args.inspect}" raise(NoMethodError, "method not found. #{name.inspect} #{args.inspect}") end |
Instance Attribute Details
#sid ⇒ Object (readonly)
Returns the value of attribute sid.
120 121 122 |
# File 'lib/dango/client_framework.rb', line 120 def sid @sid end |
Instance Method Details
#dango_client_close ⇒ Object
ユーザーが終了させたい時に呼び出すメソッド(セッションを切る)
219 220 221 |
# File 'lib/dango/client_framework.rb', line 219 def dango_client_close client_quit() # クライアントの終了処理 end |
#dango_client_init ⇒ Object
起動処理
26 27 |
# File 'lib/dango/client_framework.rb', line 26 def dango_client_init end |
#dango_client_notice_shared ⇒ Object
通知共有メモリ
340 341 342 |
# File 'lib/dango/client_framework.rb', line 340 def dango_client_notice_shared # 通知共有メモリ @client_notice_shared end |
#dango_client_notice_shared_init ⇒ Object
通知共有メモリの初期化
336 337 338 |
# File 'lib/dango/client_framework.rb', line 336 def dango_client_notice_shared_init # 通知共有メモリの初期化 @client_notice_shared = ClientNoticeShared.new(self) end |
#dango_client_receive_decrypt(str) ⇒ Object
クライアントの復号化処理
251 252 253 |
# File 'lib/dango/client_framework.rb', line 251 def dango_client_receive_decrypt(str) # 継承用 str end |
#dango_client_send_encrypt(str) ⇒ Object
クライアントの暗号化処理
243 244 245 |
# File 'lib/dango/client_framework.rb', line 243 def dango_client_send_encrypt(str) # 継承用 str end |
#dango_heart_beat_thread_init ⇒ Object
ハートビート送信スレッドの起動
178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 |
# File 'lib/dango/client_framework.rb', line 178 def dango_heart_beat_thread_init th = Thread.start do loop do begin sleep HeartBeatSendIntervalSec if @sock && ! @sock.closed? logger.debug "dango_heart_beat_thread_init:send _notice_heart_beat:" send_action("_notice_heart_beat", {}) end rescue logger.error "Exception dango_heart_beat_thread_init #{($!, 'u')}" end end end th.priority = 1 end |
#dango_receive__heart_beat(rec_obj) ⇒ Object
ハートビートなら
209 210 |
# File 'lib/dango/client_framework.rb', line 209 def dango_receive__heart_beat(rec_obj) end |
#dango_receive__notice_sid(rec_obj) ⇒ Object
接続直後のsid通知なら
199 200 201 202 |
# File 'lib/dango/client_framework.rb', line 199 def dango_receive__notice_sid(rec_obj) @sid = rec_obj["_sid"] logger.info "sid=#{@sid}" end |
#dango_receive__notice_system_message(rec_obj) ⇒ Object
システムからのメッセージ通知なら
205 206 |
# File 'lib/dango/client_framework.rb', line 205 def (rec_obj) end |
#dango_receive_decrypt(str) ⇒ Object
フレームワークから呼ばれる部分
254 255 256 |
# File 'lib/dango/client_framework.rb', line 254 def dango_receive_decrypt(str) # フレームワークから呼ばれる部分 dango_client_receive_decrypt(str) end |
#dango_send_encrypt(str) ⇒ Object
フレームワークから呼ばれる部分
246 247 248 |
# File 'lib/dango/client_framework.rb', line 246 def dango_send_encrypt(str) # フレームワークから呼ばれる部分 dango_client_send_encrypt(str) end |
#dango_session_closed ⇒ Object
セッションが切れると呼ばれる処理
30 31 |
# File 'lib/dango/client_framework.rb', line 30 def dango_session_closed end |
#send_action(action_name, send_obj) ⇒ Object
クライアントからサーバーへのデータ送信
259 260 261 262 263 264 |
# File 'lib/dango/client_framework.rb', line 259 def send_action(action_name, send_obj) logger.debug "send_action(#{action_name.inspect}, #{send_obj['_id']}) " send_obj_dup = send_obj.dup send_obj_dup["_action_name"] = action_name.to_s dango_send_data(@sock, [send_obj_dup]) end |
#send_action_return_notice(action_name, send_obj, options = {}) ⇒ Object
サーバーからクライアントへのデータ送信 自動でreturn_nameに対応したdango_receive_メソッドが出来上がるので注意 options = {:return_name=> :timeout => } return_nameは省略時は、action_nameの頭にreturnを付けたもののシンボルになる timeoutは省略時は6秒
271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 |
# File 'lib/dango/client_framework.rb', line 271 def send_action_return_notice(action_name, send_obj, = {}) # logger.debug "send_action_return_notice(#{action_name.inspect})" # logger.debug "send_action_return_notice(#{action_name.inspect}, #{send_obj.inspect}, #{options.inspect})" return_name = [:return_name] || ("return_" + action_name.to_s).to_sym timeout = [:timeout] || 6 @send_receive_mutex.synchronize do send_return_shared[action_name] = nil receive_thread = nil end_reserved_time = Time.now + timeout # 戻ってきたデータのチェック action_name_sym = (action_name.class == Symbol) ? (":"+action_name.to_s) : ('"'+action_name+'"') instance_method_name = "dango_receive_#{return_name}" expr = <<-EOF def self.#{instance_method_name}(ret_obj) # logger.debug "ret_obj:" + ret_obj.inspect send_return_shared[#{action_name_sym}] = ret_obj end EOF instance_eval expr # タイムアウトチェック (timeout.to_f / SendReceiveSleepIntervalSec).to_i.times do raise(DangoFrameworkTimeoutException, "timeout:#{action_name}") if Time.now > end_reserved_time # 送信スレッドが開始していなければ開始 if !receive_thread receive_thread = Thread.start(action_name, send_obj) do send_action(action_name, send_obj) end end # 戻ってきたデータがあれば if send_return_shared[action_name] logger.debug "action_name:#{send_return_shared[action_name].inspect}" break end sleep SendReceiveSleepIntervalSec # スリープ end if !send_return_shared[action_name] # 戻ってきたデータがあるかどうかチェック raise(DangoFrameworkException, "received data is none") end send_return_shared[action_name] end end |
#send_return_shared ⇒ Object
21 22 23 |
# File 'lib/dango/client_framework.rb', line 21 def send_return_shared @send_return_shared end |
#send_return_shared_init ⇒ Object
send_action_return_notice用の共有メモリ
18 19 20 |
# File 'lib/dango/client_framework.rb', line 18 def send_return_shared_init @send_return_shared = SharedMemoryStore.new({}) end |