Просьба прочитать через websocket искаженный

Я пытаюсь создать минимальную реализацию Websocket, используя платформу Cramp. В то время как Cramp успешно отображает обычный веб-контент, у меня возникают проблемы, когда я пытаюсь использовать веб-сокеты HTML5.

Мой класс действий выглядит следующим образом:


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"). Однако принудительное кодирование UTF через data.force_encoding('UTF-8') не решает проблему. Кроме того, после принудительного кодирования - data.valid_encoding? возвращает false, где, как это было верно, перед форсированием.

Я протестировал приложение в ruby-1.8.7 и ruby-1.9.3 . Вывод одинаков в обоих сценариях.

Еще одна странность в том, что на стороне клиента событие onmessage никогда не запускается.

Кроме того, если я удаляю вызов keep_connection_alive из HomeAction, соединение немедленно прерывается после получения данных, и все же клиент не получает данные, отправляемые сервером ("Hello world").

Я протестировал приложение в Google Chrome (последняя версия) и Mozilla Firefox (последняя версия). Проблема остается точно такой же в обоих из них. Моя операционная система - Ubuntu 12.04 LTS (Precise Pangolin).

Любая помощь в этом отношении будет принята с благодарностью.

1 ответ

Я сталкивался с тем же, и, похоже, проблема с выпущенной версией гемпа cramp 0.15.1 по сравнению с тем, что вы получаете из репозитория 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 и повторно соберите, увидьте, что упаковщик теперь сообщает, что будет использовать локальную копию драгоценного камня cramp

  5. Попробуйте снова ваше приложение, в моем сценарии, теперь это работает точно так, как ожидалось.

Казалось бы, есть исправление в github, которое они еще не выпустили (но не увеличили рабочую версию в их gemspec), или какая-то другая версия snafu, но в любом случае код в GH работает, тогда как "gem install cramp" не делает " Я могу дать вам рабочий код для веб-сокетов.

Другие вопросы по тегам