我正在尝试使用crap框架创建一个最小的Websocket实现。
当crimp成功地呈现正常的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,因为在强制编码之前它是true。我已经在ruby-1.8.7和ruby-1.9.3中测试了这个应用程序两种情况下的输出都是相同的。
另一个奇怪的事情是,在客户端,onmessage事件从未被触发。
此外,如果我从HomeAction中删除keep_connection_alive调用,则连接会在接收到数据后立即终止,而客户端仍然不会接收到服务器发送的数据(“Hello world”)。
我已经在Google chrome(最新版本)和Mozilla firefox(最新版本)中测试了这个应用程序这两个问题仍然完全相同。我的操作系统是Ubuntu12.04LTS(精确穿山甲)。
在这方面的任何帮助都将不胜感激。
最佳答案
我也遇到过同样的问题,与github repo(https://github.com/lifo/cramp)相比,cramp 0.15.1gem的发布版本似乎是个问题,它仍然被标记为0.15.1。
试试这个对我有效的实验:
本地克隆生长激素回购
将bin/和lib/文件夹以及crap.gempec文件从repo复制到您的测试crap项目中
更改您的gemfile,而不是
gem 'cramp'
包括代码的本地副本:
gemspec
gem 'cramp', :path => File.dirname(__FILE__)
删除gemfile.lock并重新绑定,查看bundler现在报告它将使用crap gem的本地副本
再次尝试你的应用程序,在我的方案中,这现在完全按照预期工作。
在github中可能有一个他们还没有发布的修复程序(但是没有在gempec中增加工作版本)或者其他版本的snafu,但是无论哪种方式,GH中的代码都可以工作,而“gem install crimp”并没有为websockets提供工作代码。