1

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

在这方面的任何帮助将不胜感激。

4

1 回答 1

4

我遇到了同样的事情,与你从 github repo (https://github.com/lifo/cramp) 得到的相比,这似乎是 cramp 0.15.1 gem 的发布版本的问题。仍标记为 0.15.1。

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

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

    gem 'cramp'
    

    包括代码的本地副本:

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

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

似乎在 github 中有一个他们尚未发布的修复程序(但没有在他们的 gemspec 中增加工作版本)或其他一些版本的问题,但无论哪种方式,GH 中的代码都可以工作,而“gem install cramp”却没有t 为您提供 websockets 的工作代码。

于 2012-10-21T13:40:41.363 回答