请求通过websocket读取乱码

时间:2012-08-14 12:12:37

标签: ruby html5 websocket cramp

我正在尝试使用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)。

我们非常感谢您在这方面的任何帮助。

1 个答案:

答案 0 :(得分:4)

我一直在遇到同样的事情,这似乎是一个问题,发布版本的抽筋0.15.1宝石与你从github repo获得的(https://github.com/lifo/cramp )思想仍然标记为0.15.1。

尝试这个适合我的实验:

  1. 在本地克隆GH repo
  2. 复制bin /和lib /文件夹,以及从repo到测试抽筋项目的cramp.gemspec文件
  3. 更改您的gemfile,而不仅仅是

    gem 'cramp'
    

    包括代码的本地副本:

    gemspec
    gem 'cramp', :path => File.dirname(__FILE__)
    
  4. 删除你的Gemfile.lock并重新捆绑,看看捆绑包现在报告它将使用抽筋宝石的本地副本

  5. 再次试用您的应用,在我的方案中,现在可以正常运行。
  6. 看起来github中有一个修复它们还没有发布(但是没有增加gemspec中的工作版本)或者其他一些版本的snafu,但无论哪种方式GH中的代码都工作而“gem安装痉挛” “不会为你提供websockets的代码。