我正在尝试使用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
My javascript code is as follows :
$(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,就像强制之前一样。
我已经在 ruby-1.8.7 和 ruby-1.9.3 中测试了该应用程序。两种情况下的输出相同。
另一个奇怪的事情是,在客户端,onmessage事件永远不会被触发。
此外,如果我从 HomeAction 中删除keep_connection_alive调用,则连接在收到数据后立即终止,并且客户端仍然没有收到服务器发送的数据("Hello world")。
我已经在谷歌浏览器(最新版本)和Mozilla Firefox(最新版本)中测试了该应用程序。它们的问题仍然完全相同。我的操作系统是Ubuntu 12.04 LTS(Precise Pangolin)。
在这方面的任何帮助将不胜感激。
遇到同样的事情,这似乎是 cramp 0.15.1 gem 的发布版本与你从 github 存储库 (https://github.com/lifo/cramp) 获得的问题相比,认为仍然标记为 0.15.1。
试试这个对我有用的实验:
- 在本地克隆 GH 存储库
- 将 bin/和 lib/文件夹中以及 cramp.gemspec 文件从存储库复制到您的测试 cramp 项目
更改您的宝石文件,而不仅仅是
gem 'cramp'
包括代码的本地副本:
gemspec gem 'cramp', :path => File.dirname(__FILE__)
擦除您的 Gemfile.lock 并重新捆绑,看到捆绑器现在报告它将使用抽筋宝石的本地副本
- 再次尝试您的应用程序,在我的方案中,这现在完全按预期工作。
看起来他们尚未发布的 github 中有修复程序(但尚未在其 gemspec 中增加工作版本)或其他一些版本混乱,但无论哪种方式,GH 中的代码都可以工作,而"gem install cramp"不会为您提供 websocket 的工作代码。