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) です。
この点で何か助けていただければ幸いです。