どうも中田です。
巷では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
これでデータの受信もできました!!
結構時間取られたーーーー(怒)









