...
...
...

программа для поддержания соединения, работающая где угодно

редакционное предисловие

Несмотря на то, что описываемая в статье программа была призвана решать очень узкую и не бог весть какую на сегодняшний день актуальную проблему вылета с диалапа по таймауту, материал определенно «имеет право на жизнь» :) Это потому, что при должной смекалке такоую софтину можно приспособить и под другие административные задачи. Плюс к статье прилагается готовый код, иллюстрирующий мысль, что иногда нужное решение можно сварганить за пару минут и буквально «на коленке».

пудель и лабрадор

Вы весь в написании новой программы на удаленной машине, с которой вы связаны коммутируемым соединением. И вдруг вам приходится прерваться, поскольку миниатюрный пудель вашего партнера, решив покончить жизнь самоубийством, ввязался в драку со вздорным желтым соседским лабрадором. После проведения разборок с местными забияками, вы возвращаетесь на рабочее место, но... ваше соединение разорвано по таймауту.
Случалось ли подобное с вами? Или, возможно, вам приходилось оттаскивать детей от телевизора, когда там демонстрировались откровенные сцены, после чего еще нужно оглядываться, чтобы удостовериться, не вернулись ли они назад?

решение для блондинок

Традиционный метод поддержания активности на линии, когда вы прервались (как в описанном выше случае), -- использовать программу 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, который отображает две цветных кнопки в графическом окне. При каждой итерации цвет кнопок меняется. Кроме того, мы задаем заголовок этого окна и тоже меняем его при каждой итерации -- таким образом, мы сможем наблюдать за процессом при свернутом окне приложения. Для определения события "закрытие окна" и выполнения нормального завершения задачи, мы подключаем обработчик событий.

Исходники программы вы можете взять по адресу http://gazette.linux.ru.net/lg87/misc/jenkins/KeepAlive.java.txt. Ее нужно скомпилировать командой:

javac KeepAlive.java

В результате вы получите три файла с расширением class, содержащие код для выполнения виртуальной машиной Java. После этого вы можете их копировать на другие машины и выполнять командой:

java KeepAlive

А вот и листинг программы:

/* @(#) KeepAlive.java Простая программа для поддержания соединения.
* Пытается найти адреса для сгенерированных имен с пятисекундным интервалом.
* Это гарантирует посылку запроса серверам имен.
* Copyright (c) 2002 Graham Jenkins
* 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


если у вас Jav’ы нет

Если на вашей машине нет Java, ее можно получить на сайте Sun MicroSystems. А если вы хотите узнать больше о сетевом программировании на Java, обратите внимание на книгу "Java Network Programming and Distributed Computing" авторства David Reilly and Michael Reilly.



Грэхем Дженкинс (Graham Jenkins), перевод Ивана Песина.


© Сетевые решения