G A C E T A   D E   L I N U X
...haciendo a Linux un poco más divertido!
Un Programa Mantener-Vivo Que puedes Correr en Cualquier lado
Por Graham Jenkins
Traducción al español por Rodrigo S. Roman Guel
el día 20 de Febrero 2003, para La Gaceta de Linux
 

El Poodle y el Labrador

Estas a la mitad de camino tecleando un nuevo programa en una computadora remota conectada sobre una línea telefónica, y te hablan para intervenir en una pelea entre la miniatura poodle de tu compañero y el feo Labrador amarillo de tu vecino. Cuando regresas, tu conexión ha terminado.

Esto es algo que te ha sucedido a ti? O quizás tuviste que arrastrar a tus niños de un episodio ofensivo de Jerry Springer, después descubriste que tienes que amarrarlos para asegurarte que no regresaran?

La solución rubia

El procedimiento tradicional para mentener la actividad de la línea durante una interrupción de tipo mencionada arriba es usar un programa 'Fortuna" en un ciclo pequeño para que una frase aleatoria sea escrita en tu pantalla cada medio minuto. Esto puede presentar serios problemas si una persona con poco cabello mira en tu pantalla y ve algo como:

 Q:  Cómo hace usted que se enciendan los ojos de una rubia?
 A:  Brilla una linterna en su oido.

Tu puedes por supuesto usar un '-i' o un parámetro equivalente para restringir a 'Fortuna' generar contenido ofensivo como:

  Definición de computo
  Encadenamiento - Un método de unir programadores al escritorio, para acelerar la salida.

Las más recientes encarnaciones del programa 'Fortuna' ofrecen a sus usuarios grupos específicos de opciones. Puedes elegir entre ofender a aquellos que son Irlandeses, homosexuales o retardados mentales!

Para el desafio de Terminal

Si solo usas el navegador para leer tus mensajes de Hotmail, probablemente tu no necesitas abrir una ventana de terminal solo para correr el programa 'Fortuna'. Si usas manejadores de ventanas compatibles X11, puedes iniciar el programa reloj con algo como:

 xclock -digital -update 1 &

Pero eso no funcionara en tu añeja maquina Windows 95 a menos que pueda correr algo como PC-Xware.

El programa 'KeepAlive.java' listado aquí esta diseñado para trabajar en cualquier lugar, esta escrito en Java 1.1 entonces aun la maquina virtual 'jview' en tu básica maquina Microsof puede manejarlo. No consiste en encontrar un 'Fortuna', 'xclock' u otro programa en una computadora remota. Y no tienes que cambiar nada cuando te conectas con diferente proveedor de servicio internet (ISP).

Encontrando un compañero

Pero tienes que enviar tráfico a algún lado, verdad? Entonces como encuentras una maquina compañera que reciva tu trafico? Si estuvieramos escribiendo este programa en comandos shell, tuviéramos que encontrar donde esta nuestro gateway, y hacerle un ping en intervalos apropiados. Eso no es tan fácil para hacer en un programa Java cual puede correr en cualquier numero de plataformas. En cualquier caso, seria grandioso poder enviar trafico a algún lado mas allá de la maquina gateway.

En casi cualquier clase de arreglo de red, las maquinas participantes tienen conocimiento de uno o más direcciones de servidor de nombres. Entonces lo que podemos hacer desde nuestro programa Java es hacer solicitudes periódicas a esos servidores de nombres. Necesitamos asegurarnos que cualquier computadora que solicitemos sus direcciones no se encuentren localmente en una tabla de computadoras. Y necesitamos también asegurar que las respuestas hacia nuestro servidor de nombres no sean almacenadas localmente. Si damos un vistazo al programa, veras que los nombres de las computadoras de quien solicitamos las direcciones son generadas examinando el tiempo en milisegundos en el tiempo de cada respuesta. Estos resultados en nombres como A1040689223909, A1040689229448, etc.

Eso es todo lo que necesitamos hacer. Pero es agradable ver algo suceder. Entonces nuestro programa define una 'MessageFrame' clase la cual despliega 2 botones en color en una ventana GUI. Los colores de los botones cambian en cada iteración. También definimos el titulo de la ventana GUI, y cambia en cada iteración - entonces todavía podemos ver que algo pasa cuando la ventana esta minimizada. Y definimos un 'listener' para detectar el evento 'window closing' y realizar un paro del programa.

Juntándolo todo

Aquí esta el programa. Necesitas compilarlo con un comando como:

 javac KeepAlive.java
Esto generara tres archivos clases que contienen código el cual puede ser ejecutado en una maquina virtual. Entonces puedes copiar esas clases a un directorio en otra computadora, después ejecutarlos con un comando como:
 java KeepAlive
Para usar la maquina virtual Microsoft en una maquina windows, usa:
 java KeepAlive

/* @(#) KeepAlive.java  Trivial keep-alive program. Tries at 5-second intervals
 *                      to find addresses for hosts with generated names. This
 *                      ensures that messages are sent to nameserver(s).
 *                      Copyright (c) 2002 Graham Jenkins <grahjenk@au1.ibm.com>
 *                      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();  // Change button colours each iteration.
    int flag=0;                         // Also switch frame-title so we can see
    while ( true ) {                    // activity whilst iconified.
      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;                // Displays two coloured buttons.
  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) {}
}

Si tienes Java 1.1 o posterior, y no requieres usar la maquina virtual Microsoft, puedes ensamblar los archivos clases dentro de un archivo 'jar', después ejecutarlo usando la opcion '-jar' como:

  echo "Main-Class: KeepAlive\015" >/tmp/MyManifest
  jar cmf /tmp/MyManifest /tmp/KeepAlive.jar *.class
  
  java -jar /tmp/KeepAlive.jar

Si no lo tienes

Si tu computadora no tiene Java, puedes obtenerlo de Sun MicroSystems. Y si necesitas saber mas acerca de programación de redes con Java, puedes darle un vistazo a "Programación de Redes en Java y Cómputo Distribuido" por David Reilly y Michael Reilly.

 

[BIO] Graham es un especialista Unix en IBM Global Services, Australia. Vive en Melbourne y ha construido y manejado muchas distribuciones propietarios y sistemas abiertos en muchas plataformas de hardware.


Copyright © 2003, Graham Jenkins. Copying license http://www.linuxgazette.com/copying.html
Publicado en el numero 87 de Linux Gazette, Febrero 2003