1

Cramp フレームワークを使用して最小限の Websocket 実装を作成しようとしています。Cramp は通常の Web コンテンツを正常にレンダリングしますが、HTML5 WebSocket を使用しようとすると問題が発生します。

私のアクションクラスは次のとおりです:


Cramp::Websocket.backend = :thin

class HomeAction < Cramp::Action
  self.transport = :websocket
  keep_connection_alive

  on_data :recv_data

  def recv_data data
    puts "got message"
    puts "#{data}"
    render "Hello world"
  end

end


私のjavascriptコードは次のとおりです:


$(function(){


    window.socket = new WebSocket("ws://localhost:3000/game");
    socket.onmessage = function(evt){
        console.log(evt.data);
        socket.close();
    }
    socket.onclose = function(evt) {
        console.log("end");
    }
    socket.onopen = function() {
        console.log("Now open!");
        socket.send("Hello");
    }


})

サーバー (シン) は、データが送信されたときに検出しますが、読み取られるテキストは文字化けします。

データのエンコーディングは ASCII-8BIT です ( puts data.encoding「ASCII-8BIT」と表示されます)。ただし、data.force_encoding('UTF-8') を使用して UTF エンコードを強制しても、問題は解決しません。さらに、エンコーディングを強制した後 - 強制するdata.valid_encoding?前に true だったところに false を返します。

ruby-1.8.7 と ruby​​-1.9.3 でアプリをテストしました。出力は両方のシナリオで同じです。

もう 1 つの奇妙な点は、クライアント側で onmessage イベントが発生しないことです。

また、HomeAction から keep_connection_alive 呼び出しを削除すると、データが受信された直後に接続が終了し、クライアントはサーバーから送信されたデータを受信しません (「Hello world」)。

Google chrome (最新バージョン) と Mozilla firefox (最新バージョン) でアプリをテストしました。問題は両方でまったく同じままです。私のオペレーティング システムは Ubuntu 12.04 LTS (Precise Pangolin) です。

この点で何か助けていただければ幸いです。

4

1 に答える 1

4

私は同じことに遭遇しましたが、それはリリースされたバージョンのcramp 0.15.1 gemと、githubリポジトリ(https://github.com/lifo/cramp)から得られるものの問題のようです。まだ 0.15.1 としてマークされています。

私のために働くこの実験を試してください:

  1. GH リポジトリをローカルに複製する
  2. bin/ フォルダーと lib/ フォルダー、および cramp.gemspec ファイルをリポジトリからテスト cramp プロジェクトにコピーします。
  3. gemfile を変更するだけでなく、

    gem 'cramp'
    

    コードのローカル コピーを含めます。

    gemspec
    gem 'cramp', :path => File.dirname(__FILE__)
    
  4. Gemfile.lock を消去して再バンドルし、バンドラーが cramp gem のローカル コピーを使用すると報告することを確認します。

  5. アプリをもう一度試してみてください。私のシナリオでは、これは期待どおりに機能するようになりました。

まだリリースされていない github の修正 (ただし、gemspec で作業バージョンをインクリメントしていない) または他のバージョンのスナフがあるように見えますが、GH のコードは機能しますが、「gem install cramp」は機能しません。 t は、websocket の作業コードを提供します。

于 2012-10-21T13:40:41.363 に答える