我正在尝试使用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提供工作代码。

09-07 23:05