Acceso Remoto usando Java

Vicente González Ruiz

December 15, 2014

Java es un lenguaje de programación muy extendido entre los programadores que usan Internet. Posee además una amplísima biblioteca de objetos que permiten diseñar aplicaciones gráficas y de tratamiento de audio. Finalmente, es conveniente saber que Java es un lenguaje interpretado lo que implica que es necesario disponer del intérprete para ejecutar un programa escrito en Java.

En el contexto concreto de Java, dicho intérprete se conoce como la máquina virtual de Java. Existe una máquina virtual casi para cualquier plataforma existente, lo que explica en cierta medida el éxito de este lenguaje de programación. En casi todos los sistemas operativos, dicha máquina virtual reside en estos dos paquetes: (1) en el JRE (Java Run-time Environment) y (2) en el JDK (Java Development Kit), que además contiene el compilador de Java. En esta práctica vamos a usar el JDK porque necesitaremos usar el compilador.

Por tanto, la primera etapa pasa por instalar el JDK (si es que ya no está instalado) en el host local. A continuación, almacenaremos en el servidor un applet (compilado) escrito en Java que presenta el contenido del fichero remoto. Finalmente, desde el host local accederemos a la página Web que contiene dicho applet usando un navegador. Este ejemplo es interesante porque el host local hace la mayor parte del trabajo (es quien ejecuta el applet).

Los pasos a realizar son los siguientes:

  1. Instalamos el JDK.
    local_host@root# apt-get install openjdk-6-jdk

  2. Descargue el applet http://www.ace.ual.es/\~vruiz/redes_industriales/ReadData.java:
     
    1import javax.swing.JApplet; 
    2import javax.swing.JRootPane; 
    3import java.net.URL; 
    4import java.net.MalformedURLException; 
    5import java.awt.Graphics; 
    6import java.awt.GridLayout; 
    7import java.awt.TextArea; 
    8import java.io.BufferedReader; 
    9import java.io.InputStreamReader; 
    10import java.io.IOException; 
    11 
    12/** 
    13 * Class ReadData - Lee el fichero "datos.txt" y lo muestra a traves 
    14 * de un area de texto en un applet. Este fichero debe estar en el 
    15 * mismo directorio que el applet. No hay parmetros de entrada. 
    16 * 
    17 * @author (Vicente Gonzalez Ruiz) 
    18 * @version (0.99) 
    19 */ 
    20public class ReadData extends JApplet { 
    21 
    22    // Numero de caracteres saltados desde el comienzo del fichero. 
    23    int SKIPPED_CHARS = 30; 
    24 
    25    /** 
    26     * Este es el primer mtodo invocado cuando el browser (o el 
    27     * applet viewer) carga el applet. 
    28     */ 
    29    public void init() { 
    30        System.err.println("init()"); 
    31 
    32        // This is a workaround for a security conflict with some 
    33        // browsers including some versions of Netscape & Internet 
    34        // Explorer which do not allow access to the AWT system event 
    35        // queue which JApplets do on startup to check access. May 
    36        // not be necessary with your browser. 
    37        JRootPane rootPane = this.getRootPane(); 
    38        rootPane.putClientProperty("defeatSystemEventQueueCheck", 
    39                                   Boolean.TRUE); 
    40 
    41        // Creamos el area de texto y la declaramos como no editable. 
    42        TextArea display = new TextArea(1, 80); 
    43        display.setEditable(false); 
    44 
    45        // Establecemos el layout manager de manera que el area de 
    46        // texto aparezca tan ancho como sea posible. 
    47        setLayout(new GridLayout(1, 0)); 
    48 
    49        // Insertamos al area de texto en el applet. 
    50        add(display); 
    51 
    52        // Determinamos el caracter de "nueva linea", que por 
    53        // desgracia es dependiente de la plataforma. 
    54        String newline = System.getProperty("line.separator"); 
    55 
    56        // El fichero de datos debe de estar en el mismo directorio 
    57        // que el code-byte del applet! Y el applet debe servirse 
    58        // usando un servidor Web. No puede probarse usando el 
    59        // navegador y cargando mediante "file://". 
    60        URL url = null; 
    61        try { 
    62            url = new URL(getCodeBase(), "datos.txt"); 
    63            System.out.println("URLficherodatos:" + url); 
    64        } catch (MalformedURLException e) {} 
    65 
    66        // Abrimos el fichero de datos. 
    67        BufferedReader buf = null; 
    68        try { 
    69            buf = new BufferedReader 
    70                (new InputStreamReader(url.openStream())); 
    71        } catch (IOException e) {} 
    72 
    73        // Saltamos SKIPPED_CHARS del fichero a leer. 
    74        try { 
    75            buf.skip(SKIPPED_CHARS); 
    76        } catch (IOException e) {} 
    77 
    78        // Leemos el resto de lineas, hasta el final del fichero. 
    79        try { 
    80            String s; 
    81            while ((s = buf.readLine()) != null) { 
    82                display.append(s + newline); 
    83            } 
    84        } catch (IOException e) {} 
    85 
    86        // Cerramos el stream. 
    87        try { 
    88            buf.close(); 
    89        } catch (IOException e) {} 
    90    } 
    91 
    92    /** 
    93     * Este metodo se ejecuta cada vez que re-visitamos la pagina Web 
    94     * que contiene el applet. 
    95     */ 
    96    public void start() { 
    97        System.err.println("start()"); 
    98    } 
    99 
    100    /** 
    101     * Detiene el applet. Esto ocurre cuando abandonamos la pagina que 
    102     * contiene el applet o la cerramos. 
    103     */ 
    104    public void stop() { 
    105        System.err.println("stop()"); 
    106    } 
    107 
    108    /** 
    109     * Pinta el applet. 
    110     * 
    111     * @param g the Graphics object for this applet 
    112     */ 
    113    public void paint(Graphics g) { 
    114        System.err.println("paint()"); 
    115    } 
    116 
    117    /** 
    118     * Libera los recursos consumidos por el applet. Este metodo se 
    119     * llama despus del metodo stop(). 
    120     */ 
    121    public void destroy() { 
    122        System.err.println("destroy()"); 
    123    } 
    124 
    125    /** 
    126     * Devuelve informacion sobre el applet. Todo applet deberia 
    127     * declarar este metodo para que retorne una variable de tipo 
    128     * String que contine informacion sobre el autor, la version y el 
    129     * copyright del applet. 
    130     * 
    131     * @return a String representation of information about this 
    132     * JApplet 
    133     */ 
    134 
    135    public String getAppletInfo() { 
    136        return "Title:\nVicente:\nMuestraelcontenidode\"data.txt\""; 
    137    } 
    138    //  public String getAppletInfo() { 
    139    //    return "Autor: Vicente Gonzalez Ruiz\\nMuestra el contenido de \\"datos.txt\\"\\n"; 
    140    //  } 
    141}
  3. Compilamos el applet:
    local_host@usuario$ javac ReadData.java

  4. Copiamos el “ejecutable” del applet en el servidor:
    # N\’otese que el applet debe estar en el mismo directorio que el  
    # fichero de datos.  
    local_host@usuario$ scp ReadData.class root@remote_host:/var/www  
     
    # Ojo, si local_host y remote_host son en realidad la misma m\’aquina,  
     el comando siguiente se simplifica. Ejecutar simplemente "sudo cp  
     ReadData.class /var/www".

  5. Almacene la página Web que carga el applet: http://www.ace.ual.es/\~vruiz/redes_industriales/ReadData.html:
     
    1<html> 
    2  <!-- Pagina Web que carga el applet "ReadData" --> 
    3  <head> 
    4    <title>ReadData Applet</title> 
    5  </head> 
    6  <body> 
    7    <h1>ReadData Applet</h1> 
    8    <hr> 
    9    <applet code="ReadData.class" 
    10            width=500 
    11            height=500 
    12            codebase="." 
    13            alt="Yourbrowserunderstandsthe&lt;APPLET&gt;\ 
    14tagbutisntrunningtheapplet,forsomereason." 
    15            > 
    16      Your browser is ignoring the &lt;APPLET&gt; tag! 
    17    </applet> 
    18    <hr> 
    19  </body> 
    20</html>

    en /var/www/ReadData.html.

  6. Ejecutamos el applet.
    # El navegador debe tener instalado el plugin de Java!!  
    local_host@usuario$ firefox http://localhost/ReadData.html &  
    # Desgraciadamente, los applets tienen severas restricciones  
    # para acceder desde el navegador a ficheros, tanto remotos  
    # como locales. Por este motivo, si el applet no funciona en firefox,  
    # probar su funcionamiento con el programa "appletviewer". Ejemplo:  
    local_host@usuario$ appletviewer http://localhost/ReadData.html &

Taller 1: De nuevo, usando Wireshark compruebe que realmente se saltan los bytes esperados del comienzo fichero remoto.

Ejercicio 1: Indique de qué manera podemos pasar desde el cliente (nuestro navegador) un parámetro al applet de forma que podamos controlar el offset a partir del cual se envía el fichero remoto. En http://download.oracle.com/javase/6/docs/api/ puede encontrar la API (Application Programming Interface) para la versión 6 de Java. En http://download.oracle.com/javase/tutorial/ encontrará además un tutorial muy extenso sobre Java. Finalmente, puede usar Google para encontrar esta información si usa como palabras clave “applet parameters”.