LoginSignup
1
2

More than 5 years have passed since last update.

Ruby初心者がWebSocket 03.em-websocketのサンプルプログラムのconnectionの状態を判断して配列を整理する

Last updated at Posted at 2016-03-10

前回のサンプルをいじってみます。

まずはcloseしたconnectionを保持しているのが良くないならそれを除去すればいい。
ということで、oncloseに以下の処理を加えてみる。

    ws_conn.onclose do
        i=0
        connnections.each {|conn|
                i=i+1
                pp "Index : #{i} state ? #{conn.state}"
        }
        connnections.each{|conn| conn.send("Connect New Client : #{i+1}") }
        connnections.each{|conn| conn.send("Reconnect Client : #{i}") }
    end

普通に考えればoncloseで呼ばれた時点で既にstatusはclosedになっているはずで、そうなればそれをcollectionから除去してあげればいいはず

では実行です。
まずはクライアント3つ接続して、2つ目を閉じます。

'''
"Index : 1 state ? connected"
"Index : 2 state ? closed"
"Index : 3 state ? connected"
'''

やはり、この時点でclosedになっているようです。
後はコレを削除すればいい。

ということで、Rubyの文法調べながら試行錯誤して以下のように変更

    ws_conn.onclose do
        connnections.each {|conn|
                if conn.state==:closed then
                        conn=nil
                end
        }
        connnections.compact!
    end

スレッドセーフであるかどうかはきちんと確認しないといけないけど、それはとりあえず、置いておくとして。。。。

Rubyの配列にはいろいろ便利な機能があって、配列の中身がnilの場合にcompactをすると
nilが除去されて、きれいになってくれるらしい。
ならば、connをnilしてしてあげればいいじゃない!

ということで、試してみる。

結果。。。。

配列が整理されていない。。。ダメポ。。。
最初と同じでブラウザ閉じてもcollectionのサイズがクリアされない。。。

なぜ???

とおもって、Javaらーな私が何気なく使っていた参照渡しの概念?とおもってみると
どうやら、Rubyは基本【値渡し】ということ。。。マジデカ。

ということで、それならばということで以下のコードに変更

    ws_conn.onclose do
        connnections.each_with_index {|conn, i|
                if conn.state==:closed then
                        connnections.fill(nil, i, 1)
                end
        }
        connnections.compact!
    end

簡単に言うと、closedのものをnilにして、compactする。

3つブラウザを立ち上げて1つ閉じてもう1回開くと接続数は3と正しい数値が取れていた。
接続も切れてないし、とりあえず、これでcollectionの整理は出来たようだ。。。

1
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
2