Instalamos el run-time de Java (si es que ya no está instalado) en el host local y almacenamos en el servidor un applet escrito en Java que presente el contenido del fichero de monitorización. A continuación desde el host local accedemos a la página Web que contiene dicho applet usando un navegador. Este ejemplo es interesante porque el PC local es el que realiza el trabajo de visualizar el contenido del fichero, y por tanto, escala bastante bien. El applet simplemente accede al host remoto para traerse los datos en el formato en que están escritos en disco. Además, desde el applet tenemos acceso a toda la biblioteca de clases desarrolladas para presentar los datos de una forma gráfica, si es esto lo que deseamos.
# Instalamos el JDK.
local_host@root# apt-get install sun-java6-jdk |
# Instalamos el JDK.
# Elegir JDK ’ultima versi’on y arquitectura adecuada! local_host@root# firefox http://java.sun.com/javase/downloads/index.jsp local_host@root# chmod +x jdk-...-rpm.bin local_host@root# ./jdk-...-rpm.bin |
# Creamos el applet.
local_host@usuario$ cat << EOF > ReadData.java import javax.swing.JApplet; import javax.swing.JRootPane; import java.net.URL; import java.net.MalformedURLException; import java.awt.Graphics; import java.awt.GridLayout; import java.awt.TextArea; import java.io.BufferedReader; import java.io.InputStreamReader; import java.io.IOException; /** * Class ReadData - Lee el fichero "datos.txt" y lo muestra a trav’es * de un ’area de texto en un applet. Este fichero debe estar en el * mismo directorio que el applet. No hay parámetros de entrada. * * @author (Vicente Gonz’alez Ruiz) * @version (0.99) */ public class ReadData extends JApplet { // N’umero de caracteres saltados desde el comienzo del fichero. int SKIPPED_CHARS = 30; /** * Este es el primer método invocado cuando el browser (o el * applet viewer) carga el applet. */ public void init() { System.err.println("init()"); // This is a workaround for a security conflict with some // browsers including some versions of Netscape & Internet // Explorer which do not allow access to the AWT system event // queue which JApplets do on startup to check access. May // not be necessary with your browser. JRootPane rootPane = this.getRootPane(); rootPane.putClientProperty("defeatSystemEventQueueCheck", Boolean.TRUE); // Creamos el ’area de texto y la declaramos como no editable. TextArea display = new TextArea(1, 80); display.setEditable(false); // Establecemos el layout manager de manera que el ’area de // texto aparezca tan ancho como sea posible. setLayout(new GridLayout(1, 0)); // Insertamos al ’area de texto en el applet. add(display); // Determinamos el caracter de "nueva l’inea", que por // desgracia es dependiente de la plataforma. String newline = System.getProperty("line.separator"); // El fichero de datos debe de estar en el mismo directorio // que el code-byte del applet! Y el applet debe servirse // usando un servidor Web. No puede probarse usando el // navegador y cargando mediante "file://". URL url = null; try { url = new URL(getCodeBase(), "datos.txt"); } catch (MalformedURLException e) {} // Abrimos el fichero de datos. BufferedReader buf = null; try { buf = new BufferedReader(new InputStreamReader(url.openStream())); } catch (IOException e) {} // Saltamos SKIPPED_CHARS del fichero a leer. try { buf.skip(SKIPPED_CHARS); } catch (IOException e) {} // Le’emos el resto de l’ineas, hasta el final del fichero. try { String s; while ((s = buf.readLine()) != null) { display.append(s + newline); } } catch (IOException e) {} // Cerramos el stream. try { buf.close(); } catch (IOException e) {} } /** * Este m’etodo se ejecuta cada vez que re-visitamos la p’agina Web * que contiene el applet. */ public void start() { System.err.println("start()"); } /** * Detiene el applet. Esto ocurre cuando abandonamos la p’agina que * contiene el applet o la cerramos. */ public void stop() { System.err.println("stop()"); } /** * Pinta el applet. * * @param g the Graphics object for this applet */ public void paint(Graphics g) { System.err.println("paint()"); } /** * Libera los recursos consumidos por el applet. Este m’etodo se * llama después del m’etodo stop(). */ public void destroy() { System.err.println("destroy()"); } /** * Devuelve informaci’on sobre el applet. Todo applet deber’ia * declarar este m’etodo para que retorne una variable de tipo * String que contine información sobre el autor, la versi’on y el * copyright del applet. * * @return a String representation of information about this * JApplet */ public String getAppletInfo() { return "Title: \\nVicente: \\nMuestra el contenido de \\"datos.txt\\""; } } EOF |
# Creamos la p’agina Web que carga el applet.
remote_host@root# cat << EOF > /var/www/ReadData.html |
# Creamos la p’agina Web que carga el applet.
remote_host@root# cat << EOF > /var/www/html/ReadData.html |
<html>
<!-- P’agina Web que carga el applet "ReadData" --> <head> <title>ReadData Applet</title> </head> <body> <h1>ReadData Applet</h1> <hr> <applet code="ReadData.class" width=500 height=500 codebase="." alt="Your browser understands the <APPLET> \ tag but isn’t running the applet, for some reason." > Your browser is ignoring the <APPLET> tag! </applet> <hr> </body> </html> EOF # Ejecutamos el applet (de forma local, en este ejemplo). # El navegador debe tener instalado el plugin de Java. local_host@usuario$ firefox http://localhost/ReadData.html & |
Para ver uso que realmente se hace de la red en esta forma de acceso remoto, utilícese un analizador de tráfico como pueda ser Wireshark. En este último caso (que utiliza la Web) determínese si el applet es capaz de acceder al final del fichero datos.txt sin que el servidor envíe dicho fichero de forma completa.