Программа для поддержания соединения,
работающая где угодно
Автор: Грэхем
Дженкинс (Graham Jenkins)
Перевод: Иван Песин
Вы весь в написании новой программы на удаленной машине, с которой вы связаны коммутируемым соединением. И вдруг вам приходится прерваться, поскольку миниатюрный пудель вашего партнера, решив покончить жизнь самоубийством, ввязался в драку со вздорным желтым соседским лабрадором. После проведения разборок с местными забияками, вы возвращаетесь на рабочее место, но... ваше соединение разорвано по тайм-ауту.
Случалось ли подобное с вами? Или, возможно, вам приходилось оттаскивать детей от телевизора, когда там демонстрировались откровенные сцены, после чего еще нужно оглядываться, чтобы удостовериться, не вернулись ли они назад?
Традиционный метод поддержания активности на линии, когда вы прервались (как в описанном выше случае), -- использовать программу 'fortune' в небольшом цикле для вывода чего-нибудь на экран каждые полминуты. Но это может создать серьезные проблемы, если, например, человек со светлым волосом увидит на вашем экране что-то вроде:
Вопрос: Как зажечь глаза у блондинки? Ответ: Посветить фонариком ей в глаза
Конечно, можно использовать параметры, указывающие 'fortune' выводить безобидные материалы:
Компьютерное определение: Связывание -- Метод подсоединения программистов к столу, для увеличения произодительности
Наиболее свежие версии программы 'fortune' позволяют своим пользователям задавать гораздо более интересные ограничения. Например, можно выбирать наборы шуток над ирландцами, геями или умственно отсталыми!
Если вы просто пользуетесь браузером для чтения своих сообщений с Hotmail, вам, вероятно, будет неудобно открывать терминал лишь для того, чтобы запустить программу 'fortune'. В этом случае, если ваш оконный менеджер совместим с X11, можно запустить программу "часы", например:
xclock -digital -update 1 &
Но это не будет работать на ваших старинных Windows 95, разве что вы используете PC-Xware.
Приведенная ниже программа 'KeepAlive.java' сделана так, чтобы работать везде. Написана она на Java 1.1, потому даже виртуальная машина 'jview' на вашем компьютере с операционной системой Microsoft сможет ее выполнить. Она не зависит от 'fortune', 'xclock' или любой другой программы. И вам не придется ничего менять даже если вы подсоединитесь через другого провайдера.
Но вам нужно куда-то слать трафик, так? Как же найти машину, которая будет получать ваш трафик? Если бы мы писали эту программу, как скрипт, мы могли бы узнать наш машрутизатор и "пинговать" его через определенный интервал времени. Но это не так просто сделать в Java-программе, которая должна запускаться на разных платформах. И в любом случае, будет хорошо, если мы сможем слать трафик куда-нибудь за маршрутизатор.
Практически в любом сетевом окружении, машины знают сетевой адрес одного или более серверов имен. Значит мы можем выполнять периодические запросы к серверу имен. Но нужно быть уверенным, что запрашиваемые имена не будут найдены в локальной таблице хостов. Если вы теперь посмотрите на программу, вы увидите, что запрашиваемые имена генерируются на основе миллисекунд во время каждого запроса. В результате получаются имена, вроде A1040689223909, A1040689229448.
Это все, что нам нужно. Но еще было бы хорошо видеть, что происходит. Потому программа определяет класс 'MessageFrame', который отображает две цветных кнопки в графическом окне. При каждой итерации, цвет кнопок меняется. Кроме того, мы задаем заголовок этого окна и тоже меняем его при каждой итерации -- таким образом, мы сможем наблюдать за процессом при свернутом окне приложения. Для определения события "закрытие окна" и выполнения нормального завершения задачи, мы подключаем обработчик событий.
Исходники программы вы можете взять здесь. Ее нужно скомпилировать командой:
javac KeepAlive.java
В результате вы получите три файла с расширением 'class', содержащие код для выполнения виртуальной машиной Java. После этого вы можете их копировать на другие машины и выполнять командой:
java KeepAlive
А вот и сам листинг программы:
/* @(#) KeepAlive.java Простая программа для поддержания соединения. * Пытается найти адреса для сгенерированных имен с пятисекундным интервалом. * Это гарантирует посылку запроса серверам имен. * Copyright (c) 2002 Graham Jenkins <[email protected]> * All rights reserved. Version 1.06, August 15, 2002. */ import java.io.*; import java.net.*; import java.awt.*; import java.awt.event.*; import java.util.Date; public class KeepAlive { public static void main(String[] args) { MessageFrame f=new MessageFrame(); // Изменить цвет кнопок при каждой итерации. int flag=0; // Изменить заголовок окна, чтобы видеть работу while ( true ) { // в свернутом состоянии. f.statusMess(Color.red,Color.red); f.setTitle("==X=="); try {InetAddress addr=InetAddress.getByName("A"+(new Date()).getTime());} catch (UnknownHostException ioe) {} if(flag==0) {f.statusMess(Color.yellow,Color.green); f.setTitle("1.06");} else {f.statusMess(Color.green,Color.yellow); f.setTitle("KeepAlive");} flag=1-flag; try {Thread.sleep(5000L);} catch (InterruptedException e) {} } } } class MessageFrame extends Frame implements ActionListener { private Button b1, b2; // Отображает две цветных кнопки. public MessageFrame() { Panel p=new Panel(); p.setLayout(new FlowLayout()); b1=new Button() ; b2=new Button(); p.add(b1); p.add(b2); this.add("South",p); this.setSize(150,50); this.show(); this.addWindowListener(new WindowAdapter() { public void windowClosing(WindowEvent e) { System.exit(0); } }); } public void statusMess(Color left, Color right) { b1.setBackground(left); b2.setBackground(right); } public void actionPerformed(ActionEvent e) {} }
Если у вас Java 1.1 или старше и нет необходимости использовать виртуальную машину Microsoft, вы можете собрать все файлы в один 'jar'-файл, а потом пользоваться только им:
echo "Main-Class: KeepAlive\015" >/tmp/MyManifest jar cmf /tmp/MyManifest /tmp/KeepAlive.jar *.class java -jar /tmp/KeepAlive.jar
Если на вашей машине нет Java, ее можно получить на сайте Sun MicroSystems. А если вы хотите узнать больше о сетевом программировании на Java, обратите внимание на книгу "Java Network Programming and Distributed Computing" by David Reilly and Michael Reilly.
Грэхем -- специалист по Unix в Австралийском
представительстве IBM Global Services. Он живет в Мельбурне и
занимается установкой и сопровождением различных проприетарных и
открытых систем на разных аппаратных платформах.
Copyright (c) 2003, Graham Jenkins.
Copying license http://www.linuxgazette.com/copying.html
Published in Issue 87 of Linux Gazette, February
2003