Просьба прочитать через 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.
Попробуйте этот эксперимент, который работает для меня:
- Клонируйте репозиторий GH локально
- Скопируйте в папки bin/ и lib/, а также файл cramp.gemspec из репозитория в ваш тестовый проект cramp
Измените свой гемфайл, а не просто
gem 'cramp'
Включите локальную копию кода:
gemspec gem 'cramp', :path => File.dirname(__FILE__)
Сотрите свой Gemfile.lock и повторно соберите, увидьте, что упаковщик теперь сообщает, что будет использовать локальную копию драгоценного камня cramp
- Попробуйте снова ваше приложение, в моем сценарии, теперь это работает точно так, как ожидалось.
Казалось бы, есть исправление в github, которое они еще не выпустили (но не увеличили рабочую версию в их gemspec), или какая-то другая версия snafu, но в любом случае код в GH работает, тогда как "gem install cramp" не делает " Я могу дать вам рабочий код для веб-сокетов.