请求通过网络套接字读取被乱码



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

试试这个对我有用的实验:

  1. 在本地克隆 GH 存储库
  2. 将 bin/和 lib/文件夹中以及 cramp.gemspec 文件从存储库复制到您的测试 cramp 项目
  3. 更改您的宝石文件,而不仅仅是

    gem 'cramp'
    

    包括代码的本地副本:

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

  5. 再次尝试您的应用程序,在我的方案中,这现在完全按预期工作。

看起来他们尚未发布的 github 中有修复程序(但尚未在其 gemspec 中增加工作版本)或其他一些版本混乱,但无论哪种方式,GH 中的代码都可以工作,而"gem install cramp"不会为您提供 websocket 的工作代码。

相关内容

  • 没有找到相关文章

最新更新