Я хочу показать ход выполнения моей программы (здесь он представлен в виде цикла) на веб-сайте в режиме реального времени.
Если у меня работает правильный сервер Ruby, клиент должен иметь возможность подключаться к серверу через веб-сокеты с помощью браузера и после подключения получать «обновления» о недавно созданном процессе в режиме реального времени. Никаких опросов или Ajax не требуется.
Моя идея проверить это состоит в том, чтобы установить дуплексную связь между EventMachine::WebSocket и клиентским браузером с использованием клиентского JavaScript. Создайте цикл и отправьте обновления клиенту браузера.
ruby_socket_server.rb:
require 'eventmachine'
require 'em-websocket'
@sockets = []
EventMachine.run do
EventMachine::WebSocket.start(:host =>'localhost',:port =>8887) do |socket|
socket.onopen do
@sockets << socket
(0..10).each do |i|
puts "i am on loop #{i}" #to terminal window
@sockets.each do |s|
s.send "Just received notification of loop #{i}"
sleep(1) #pause for a second
end
end
end
end
основной.js:
socket = new WebSocket('ws://localhost:8887');
socket.onopen = function(){
console.log('OPEN');
}
socket.onclose = function(){
console.log('CLOSED');
}
socket.onmessage = function(msg){
console.log(msg);
}
Я ожидаю, что это будет выглядеть так:
- Сервер: я на петле 1.
- Клиент: только что получил уведомление о цикле 1.
- Сервер: я нахожусь на петле 2.
- Клиент: только что получил уведомление о цикле 2.
Что происходит на самом деле:
- Сервер: я на петле 1.
- Сервер: я нахожусь на петле 2.
- Клиент: только что получил уведомление о цикле 1.
- Клиент: только что получил уведомление о цикле 2.
Я не могу отправить данные клиенту из цикла Ruby, т. е. он в конечном итоге отправляет все пакеты, но не ВО ВРЕМЯ каждой итерации, как ожидалось. Вместо этого он ждет, пока цикл сервера не завершится, и отправляет несколько вызовов подряд.
Что я здесь делаю неправильно? Возможно ли то, что я ищу? Любые мысли о том, как взломать этот орех, будут полезны.