どうも中田です。
巷ではrailsでwebsocketを動かすのは簡単♪簡単♪って言ってたけど、
こと、私に関しては超苦戦しました。。。
備忘の為にも残しておきます。
指示通りにwebsocket-railsを入れて動かしても、クライアントから接続 & メッセージ送信ができない。。
railsサーバ側では、websocket_rails.log
のログが出てはいるんですが、
[ConnectionManager] Connection opened: #<Connection::b92f9ba0851e100d10be> ... [ConnectionManager] Connection closed: #<Connection::b92f9ba0851e100d10be>
を繰り返すばかり。。。
そもそも接続要求すら受け付けてくれてないっぽい。
さて、どうしたものか
バージョン依存問題
2015/12/28現在
gem 'websocket-rails'
を追加して、$ bundle install
した結果、各バージョンはこのようになってました。
(略) faye-websocket (0.10.2) eventmachine (>= 0.12.0) websocket-driver (>= 0.5.1) (略) websocket-driver (0.6.3) websocket-extensions (>= 0.1.0) websocket-extensions (0.1.2) websocket-rails (0.7.0) em-synchrony faye-websocket hiredis rack rails redis redis-objects thin (略)
どこぞのサイトでわかったのですが、faye-websocketのバージョンをサゲタマエ!と
faye-websocket (0.10.2)
↓↓↓↓
faye-websocket (0.10.0)
すると、、、クライアントにてコネクションオープンした際のコールバックが呼び出されました!!!
どうやら接続はできたようです。
しかし、送信すると、
[Event] Invalid Event Received: WebsocketRails::Event::UnknownDataType [Event] Event Data: {"event":"websocket_chat","data":{"level":1}} [Event] WebsocketRails::Event::UnknownDataType: WebsocketRails::Event::UnknownDataType [Event] /Users/*****/.rbenv/versions/2.1.2/lib/ruby/gems/2.1.0/gems/websocket-rails-0.7.0/lib/websocket_rails/event.rb:76:in `new_from_json' ...
みたいなエラー発生
websocket_rails修正
エラーが発生している箇所を確認してみました。
def self.new_from_json(encoded_data, connection) case encoded_data when String event_name, data = JSON.parse encoded_data unless event_name.is_a?(String) && data.is_a?(Hash) raise UnknownDataType end data = data.merge(:connection => connection).with_indifferent_access Event.new event_name, data
dataがnilになっちゃってますね。
なので、このように修正してみました。
def self.new_from_json(encoded_data, connection) case encoded_data when String #event_name, data = JSON.parse encoded_data json = JSON.parse encoded_data event_name = json["event"] data = json unless event_name.is_a?(String) && data.is_a?(Hash) raise UnknownDataType end data = data.merge(:connection => connection).with_indifferent_access Event.new event_name, data
これでデータの受信もできました!!
結構時間取られたーーーー(怒)