Как динамически показать вывод ping на веб-странице? - PullRequest
9 голосов
/ 09 июля 2010

В качестве части страницы диагностики я хотел бы, чтобы пользователь мог запускать «ping», то есть обычную команду оболочки, чтобы отправлять ICMP_ECHO_REQUST на определенный IP-адрес и динамически отображать результаты в div в браузере.

Бэкэнд - Ruby / Rails.

Я уже не выполняю команду на стороне сервера и не читаю вывод команды ping.

И я собиралвеб-страницы, которые периодически перезванивают на сервер, чтобы динамически обновлять некоторые части страницы.

Но в этом случае есть три проблемы:

  • иметь возможность обратного вызова ajaxв uri / url, чтобы найти процесс, который запускает команду ping
  • , в идеале, чтобы иметь возможность обновлять страницу, когда команда ping возвращает новую строку данных
  • При желании можно «прервать»пинг.С помощью ping я, конечно, могу просто установить опцию, чтобы отправлять только x ping и затем выходить, что исключает необходимость остановки процесса.Но у меня также есть другой инструмент, следующий за ним, просмотрщик журналов, и этот инструмент не останавливается сам по себе после определенного количества строк, а продолжается вечно, если не прерывается, то есть с Control-C.

Я установил memcache для рандеву с процессом, запускающим ping, или есть более простой способ?

Я много искал, думая, что это должно быть достаточно распространенной проблемой, чтобы плагин rails просто волшебным образом реализовывал чтонужно, но я почти ничего не нашел.

Есть предложения или указатели?

Ответы [ 2 ]

7 голосов
/ 03 декабря 2010

Если я вас правильно понимаю, вам обычно нужно получить некоторую информацию с веб-сервера в клиенте, в то время как клиент не знает, когда именно эта информация поступает, то есть передает информацию с веб-сервера на клиент. Есть несколько способов сделать это, у всех есть свои недостатки:

  • HTTP push - требует, чтобы соединение с поддержкой активности и сервер продолжали отправлять информацию в виде фрагментов, каждый раз объявляя о поступлении следующего фрагмента и не отправляя его до готовности. Обычно этот «поток chucked» принимается либо в объекте XMLHttpRequest, либо в скрытом iframe, хотя можно просто отобразить его пользователю, как есть, если это желательно (как в вашем случае).
  • Опрос - клиент просто спрашивает сервер, регулярно ли что-то приходит. Устрашает, имеет огромные задержки обмена сообщениями, и это трафик, но работает почти всегда.
  • Длинный опрос - комбинация опроса и HTTP-запроса - то есть первый ответ после опроса задерживается до тех пор, пока не будет ответа.
  • События, отправленные сервером (SSE) - почти принятый стандарт, давно внедренный в Opera, теперь многие браузеры поддерживают его, и он стремится стать стандартом W3C.
  • WebSockets - это также новый стандарт, предложенный Google, который позволяет использовать более сложные TCP-соединения с функцией отправки / получения из Javascript. Он также может быть использован для HTTP push.
  • Использование не-HTML методов (например, Flash, Java, Silverlight) для получения входящего контента. Для этой цели доступно несколько библиотек / готовых модульных SWF-файлов / апплетов (например, BlazeDS ), которые могут туннелировать информацию из данного соединения для выполнения в виде JSON на целевой странице, например.

Все эти методы действительно охватываются зонтичными терминами «HTTP push» и «comet». Существует множество документации, учебных пособий и существующих решений. Например, для RoR вы можете попробовать Джаггернаут или shoot_star , или просто выбрать минималистичные решения .

Наконец, я хотел бы порекомендовать отличную статью Грегора Рота о SSE (часть 1) и WebSockets (часть 2) , которая дает подробные объяснения, примеры и перспективы для использование.

2 голосов
/ 09 июля 2010

Из того, что это звучит, вам нужен пинг только тогда, когда страница загружена, и люди смотрят ее.Если это так, я думаю, вы можете избежать бэкэнд-процесса.

Я бы подумал, что вызов ajax для действия контроллера, который пингует, а затем выводит ответ.Вы можете управлять частотой, запускать, останавливать javascript на странице и обновлять конкретный div или другой объект страницы с помощью ответа.

В этом примере используется библиотека ping рубина, которая возвращает только true.Если вам нужно больше функциональности, есть другие доступные библиотеки (например, net-ping ).

В вашем контроллере

require 'ping'

def ping
  if Ping.ping_echo(params[:hostname], params[:timeout])
    render :text => "Oh goodie, it pinged successfully"
  else
    render :text => "No go on the pingage"
  end
end

А затем в вашем javascript (я используюjQuery, но вы можете использовать prototype / scriptaculous или ваш любимый JS-фреймворк):

function ping_host {
  $.get("/controller/ping", function(data){
    $("#some_div_id").append(data);
  });
}

Оттуда вы можете использовать команду setTimeout, чтобы запускать ее каждые 5 секунд или как бы часто вы ни хотели генерировать пинг.

Если вам нужен постоянный пинг, вы можете посмотреть на некоторые обработчики заданий бэкэнда, такие как resqueue , которые бы обновляли таблицу базы данных с результатами пинга, или хранилище memcachedчто вы затем опросите, используя метод, описанный выше со страницы.

...