質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

89.64%

websocket-rails を用いてserverとコネクトを試みると Error during WebSocket handshakeというエラーが出て困っています

解決済

回答 1

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 7,388

yamatora

score 11

現在チャット機能を作っております。Websocketを通してサーバと接続する箇所を実装しました。しかしwebsocket-railsとサーバとの接続の際に Error during WebSocket handshake Invalid status lineという内容のエラーが出てしまい困っております。websocket-railsに関する記事を元にテストとして動かそうと思ったのですが、うまくいきません。どのようにしたらこのエラーを解消できるか教えてください。

参考にしたサイト
http://www.school.ctc-g.co.jp/columns/masuidrive/masuidrive14.html
http://takuyanz.hatenablog.com/
環境:localのdevelop
サーバ:webrick(port:3000) redis(port:6379)
言語:Ruby 2.2.3p173(フレームワーク Rails(4.2.1))
使用gem:websocket-rails
ブラウザ:chrome

実行内容
webrickサーバ起動
rails s 

Started GET "/chatRoom" for 127.0.0.1 at 2015-12-23 ・・・


redis起動
redis-server /usr/local/etc/redis.conf

74440:M 23 Dec 11:49:39.638 # Server started, Redis version 3.0.5
74440:M 23 Dec 11:49:39.638 * DB loaded from disk: 0.000 seconds
74440:M 23 Dec 11:49:39.638 * The server is now ready to accept connections on port 6379


実行結果
ページをロードするとブラウザのコンソールに以下のエラーが表示されます。

WebSocket connection to 'ws://localhost:6379/websocket' failed: Error during WebSocket handshake: Invalid status line
General
Request URL:ws://localhost:6379/websocket
Request Method:GET
Status Code:200 OKRequest Headers
Accept-Encoding:gzip, deflate, sdch
Accept-Language:ja,en-US;q=0.8,en;q=0.6
Cache-Control:no-cache
Connection:Upgrade
Cookie:xxx_logined=2015-12-13+17%3A55%3A50+UTC; _websocketTest_session=・・・; _websocket-rails-demo_session=・・・; _message_session=・・・
Host:localhost:6379
Origin:http://localhost:3000
Pragma:no-cache
Sec-WebSocket-Extensions:permessage-deflate; client_max_window_bits
Sec-WebSocket-Key:/・・・
Sec-WebSocket-Version:13
Upgrade:websocket
User-Agent:Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/47.0.2526.106 Safari/537.36

ソースコード
Gemfile

gem 'websocket-rails'


chat_controller.rb

require 'redis'
class ChatController < WebsocketRails::BaseController

  def recieve_message
    message = message()
    broadcast_message :show_message, message
  end
  def initialize_session
    logger.info("initialize chat controller")
    @redis = Redis.new(:host => "127.0.0.1", :port => 6379)
    controller_store[:redis] = @redis
  end

  def connect_user
    logger.debug("connected user")
    gid = session[:group_id]  
    talks = controller_store[:redis].lrange gid, 0,100
    talks.each do |message|
      msg = ActiveSupport::HashWithIndifferentAccess.new(eval(message))
      send_message :new_message, obj
    end
  end

show_chat_room.html.erb

<div id="message_box">
  <p>broadcasting message</p>
  <!-- message will be shown here -->
</div>
<input type="text" id="message_input">
<input type="button" id="send_message" value="send">
<script>
  $(document).ready(function(e){
    var dispatcher = new WebSocketRails('localhost:6379/websocket');

    $(document).on("click", "#send_message", function(e){
      message_text = $("#message_input").val();
      dispatcher.trigger("send_message", message_text);
    });

    dispatcher.bind("show_message", function(message){
      console.log(message);
      $("#message_box").append("<p>" + message + "</p>");
    });
  });
</script>

events.rb

WebsocketRails::EventMap.describe do
  subscribe :send_message, :to => ChatController, :with_method => :recieve_message
end

development.rb

.
.
  config.middleware.delete Rack::Lock
・
・
  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 1

checkベストアンサー

0

使ったことがないので、的外れかもしれません。

サーバ:webrick(port:3000) redis(port:6379)   

となっていて、

WebSocket connection to 'ws://localhost:6379/websocket' failed: Error during WebSocket handshake: Invalid status line  

ということは、redis(port:6379)につないでいますが、webrick(port:3000)でなくてよいのでしょうか?

直接のエラーメッセージ原因は、サーバからの応答のStatus-Lineが、

HTTP/1.1 101 Switching Protocols


のようになるべきところ、

HTTP/1.1 200 OK


のようになっていることと思います。

参考ページ:RFC6455 — The WebSocket Protocol 日本語訳

[RFC2616] に従う, 101 応答コードを伴う Status-Line 。 その種の応答は、 "HTTP/1.1 101 Switching Protocols" のような形をとるであろう。


(2015/12/27 9:03 追記)
コメント欄の内容を追記しておきます。
以下の2つを実施することで、動作するようになったようですね。

 404の記述を削除

config/routes.rbに入れていた、

get '*path', to: 'application#render_404'


という記述を削除する。

 faye-websocketのバージョンを0.10.0に変更

websocket-rails 0.7.0 thin 1.6.4 / Handshake times out #379
に該当するようだったため、faye-websocketのバージョンを0.10.0に変更した。

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2015/12/27 07:37

    対処出来ました!
    何かと解決策を教えていただき本当にありがとうございます。大変助かりました。

    キャンセル

  • 2015/12/27 09:08

    動くようになってよかったです。

    コメントの内容を、回答に追記しておきました。
    スタンドアローンにすることは、必要かどうかわからなかったので、
    ひとまず追記はしませんでした。

    キャンセル

  • 2015/12/27 12:09

    コメントの追記ありがとうございます。次に同じようなことで困った人の役にも立つかもしれませんね。

    キャンセル

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 89.64%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる