技術

【rails】websocket-rails動きません!

投稿日:

どうも中田です。

巷では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

 
 

これでデータの受信もできました!!

結構時間取られたーーーー(怒)

-技術
-,

執筆者:


comment

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください

関連記事

[Xcode]Provisioning ProfileのUUIDを確認する方法

どうも田中です。 iOSアプリの審査に向けて作業している最中、buildエラーに …

Google Web Developers便利なコマンドラインAPIの使い方

こんにちは。佐藤です。 今回はGoogle Web Developersで使える …

コマンド一つで「20190729」みたいなスラッシュなしの日付を入力したい!

こんにちは。たなかです。 Macで「きょう」と入力すると、今日の日付が予測変換さ …

【AWS】VMWareからAWSへサーバ移設

どうも中田です。 今回はVMWareからAWSへのマイグレーションに関するお話。 …

[JS] イベントバブリングまとめ

どうも中田です いつも忘れちゃうんですよ。 javascriptのイベントバブリ …