我正在尝试使用 Cramp 框架创建一个最小的 Websocket 实现。当 Cramp 成功呈现正常的 Web 内容时,我在尝试使用 HTML5 websockets 时遇到了麻烦。
我的动作类如下:
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?
返回 false ,因为它在强制之前为 true。
我已经在 ruby-1.8.7 和 ruby-1.9.3 中测试了该应用程序。两种情况下的输出相同。
另一个奇怪的事情是,在客户端永远不会触发 onmessage 事件。
此外,如果我从 HomeAction 中删除 keep_connection_alive 调用,则连接在接收到数据后立即终止,并且客户端仍然没有收到服务器发送的数据(“Hello world”)。
我已经在 Google chrome(最新版本)和 Mozilla firefox(最新版本)中测试了该应用程序。两者的问题完全相同。我的操作系统是 Ubuntu 12.04 LTS(Precise Pangolin)。
在这方面的任何帮助将不胜感激。