Clases Java para comunicaciones en red Lenguajes y Herramientas de Programación Universidad de La Laguna Programa de Doctorado de Fı́sica e Informática Escuela Técnica Superior Superior de Ingenierı́a Informática Dpto. Sistemas Informáticos y Computación 2004-2005 Resumen El objetivo de esta práctica es mostrar el modo de funcionamiento de las clase Java para definir nombres de recursos en Internet. 1. La clase InetAddress La clase InetAddress proporciona objetos que se pueden utilizar para manipular tanto direcciones IP como nombres de dominio. Ejemplo El ejemplo TestInetAddress.java trata de ilustrar la utilización de varios de los métodos de la clase InetAddress. Para que el programa se ejecute correctamente y no aparezca una excepción del tipo “UnknownHostException”, hay que estar conectados convenientemente. En caso de conectarse a un proveedor de Internet, la asignación de direcciones es automática por parte del ISP (Internet Service Provider ), con lo cual se va a obtener una dirección diferente en cada conexión. import java.net.*; class TestInetAddress { public static void main( String[] args ) { try { System.out.println( "-> Direccion IP de una URL, por nombre" ); InetAddress address = InetAddress.getByName( "nereida.deioc.ull.es" ); System.out.println( address ); // Extrae la dirección IP a partir de la cadena que se // encuentra a la derecha de la barra /, luego proporciona // esta dirección IP como argumento de llamada al método getByName() System.out.println( "-> Nombre a partir de la direccion" ); int temp = address.toString().indexOf( ’/’ ); 1 Herramientas y Lenguajes de Programación 04-05 2 address = InetAddress.getByName( address.toString().substring(temp+1) ); System.out.println( address ); System.out.println( "-> Direccion IP actual de LocalHost" ); address = InetAddress.getLocalHost(); System.out.println( address ); System.out.println( "-> Nombre de LocalHost a partir de la direccion" ); temp = address.toString().indexOf( ’/’ ); address = InetAddress.getByName( address.toString().substring(temp+1) ); System.out.println( address ); System.out.println( "-> Nombre actual de LocalHost" ); System.out.println( address.getHostName() ); System.out.println( "-> Direccion IP actual de LocalHost" ); // Coge la dirección IP como un array de bytes byte[] bytes = address.getAddress(); // Convierte los bytes de la dirección IP a valores sin // signo y los presenta separados por espacios for( int cnt=0; cnt < bytes.length; cnt++ ) { int uByte = bytes[cnt] < 0 ? bytes[cnt]+256 : bytes[cnt]; System.out.print( uByte+" " ); } System.out.println(); } catch( UnknownHostException e ) { System.out.println( e ); System.out.println( "Debes estar conectado para que esto funcione bien." ); } } } 2. La clase URL La clase URL contiene constructores y métodos para la manipulación de URL (Universal Resource Locator ), esto es, un objeto o servicio en Internet. Ejemplo 1 La clase del ejemplo TestURL.java muestra el uso de los cuatro tipos de constructores y de los métodos de la clase URL. Además, en el programa se utiliza la clase URLEncoder para convertir una cadena conteniendo espacios y otra en la que se sigue el formato x-www-form-url. import java.net.*; class TestURL { public static void main( String[] args ) { TestURL obj = new TestURL(); try { Herramientas y Lenguajes de Programación 04-05 3 System.out.println( "Constructor simple para URL principal" ); obj.display( new URL( "http://nereida.deioc.ull.es" ) ); System.out.println( "Constructor de cadena para URL + directorio" ); obj.display( new URL( "http://nereida.deioc.ull.es/~cleon" ) ); System.out.println( "Constructor con protocolo, host y directorio" ); obj.display( new URL("http","nereida.deioc.ull.es","/~cleon" ) ); System.out.println( "Constructor con protocolo, host, puerto y directorio" ); obj.display( new URL( "http","nereida.deioc.ull.es", 80, "/~cleon" ) ); System.out.println( "Construye una direccion absoluta a partir de la \n"+ "direccion del Host y una URL relativa" ); URL baseURL = new URL( "http://nereida.deioc.ull.es/~cleon"); obj.display( new URL( baseURL, "/psd/" ) ); System.out.println( "Uso de URLEncoder para crear una cadena x-www-form-url" ); System.out.println( URLEncoder.encode( "http://espacio .tilde~.mas+.com" ) ); } catch( MalformedURLException e ) { System.out.println( e ); } } // Método para poder presentar en la pantalla partes de una dirección URL void display( URL url ) { System.out.print( url.getProtocol()+" " ); System.out.print( url.getHost()+" " ); System.out.print( url.getPort()+" " ); System.out.print( url.getFile()+" " ); System.out.println( url.getRef() ); // Presentamos la dirección completa como una cadena System.out.println( url.toString() ); System.out.println(); } } Ejemplo 2 En el ejemplo URLReader.java se crea un objeto URL, se establece una conexión y se leen los datos mediante un flujo de entrada. import java.net.*; import java.io.*; public class URLReader { public static void main(String[] args) throws Exception { URL pcgull = new URL("http://nereida.deioc.ull.es/~cleon/in.dat"); BufferedReader in = new BufferedReader( new InputStreamReader(pcgull.openStream())); String inputLine; Herramientas y Lenguajes de Programación 04-05 4 while ((inputLine = in.readLine()) != null) System.out.println(inputLine); in.close(); } } Ejemplo 3 El ejemplo SiteSelector.java crea un objeto URL, y mediante un applet se muestra en el navegador la página especificada. import import import import java.awt.Button; java.awt.event.*; java.net.*; java.applet.*; public class SiteSelector extends Applet implements ActionListener { Site siteList[]; public void init() { siteList = new Site[2]; siteList[0] = new Site("Java Home ", "http://www.javasoft.com/index.html"); siteList[1] = new Site("PSD Home", "http://nereida.deioc.ull.es/~cleon/psd/index.html"); for ( int i = 0; i < siteList.length; i++) { Button b = new Button( siteList[i].getTitle()); add(b); b.addActionListener(this); } } public void gotoSite( URL loc) { try { AppletContext context = getAppletContext(); context.showDocument(loc); } catch (Exception ex) { showStatus("Error"+ex); } } public void actionPerformed( ActionEvent e) { String title; URL location; String actionCommand = e.getActionCommand(); if (e.getSource() instanceof Button) { for (int i = 0; i < siteList.length; i++) { title = siteList[i].getTitle(); location = siteList[i].getURL(); if (actionCommand.equals(title)) gotoSite(location); Herramientas y Lenguajes de Programación 04-05 5 } } } } // SiteSelector class Site extends Button { private String title; private URL location; public Site( String siteTitle, String siteLocation) { title = siteTitle; try { location = new URL (siteLocation); } catch (MalformedURLException e) { System.err.println("URL not valid: " + siteLocation); } } public String getTitle() { return title; } public URL getURL() { return location; } } El fichero html en el que se incrusta el applet es SiteSelector.html 3. La clase URLConnection Una vez instanciado un objeto de la clase URL, si se invoca al método, openConnection() y la comunicación se puede establecer de forma satisfactoria, se obtiene una instancia de un objeto de la clase URLConnection. Ejemplo 1 El ejemplo URLConnectionReader.java crea un objeto URL, se crea una conección y se leen los datos mediante un flujo de entrada. import java.net.*; import java.io.*; public class URLConnectionReader { public static void main(String[] args) throws Exception { URL pcgull = new URL("http://nereida.deioc.ull.es/~cleon/in.dat"); URLConnection pcg = pcgull.openConnection(); BufferedReader in = new BufferedReader( new InputStreamReader( pcg.getInputStream())); Herramientas y Lenguajes de Programación 04-05 6 String inputLine; while ((inputLine = in.readLine()) != null) System.out.println(inputLine); in.close(); } } Ejemplo 2 El ejemplo Reverse.java crea un objeto URL, se crea una conección con un cgi que devuelve la entrada invertida. import java.io.*; import java.net.*; public class Reverse { public static void main(String[] args) throws Exception { if (args.length != 1) { System.err.println("Usage: System.exit(1); } java Reverse " + "string_to_reverse"); String stringToReverse = URLEncoder.encode(args[0]); URL url = new URL("http://java.sun.com/cgi-bin/backwards"); URLConnection connection = url.openConnection(); connection.setDoOutput(true); PrintWriter out = new PrintWriter( connection.getOutputStream()); out.println("string=" + stringToReverse); out.close(); BufferedReader in = new BufferedReader( new InputStreamReader( connection.getInputStream())); String inputLine; while ((inputLine = in.readLine()) != null) System.out.println(inputLine); in.close(); } } La clases URL y URLConnection proporcionan un mecanismo para acceder a los recursos Internet con un nivel más o menos alto. 4. Ejercicios 1. Compile y ejecute los ejemplos de cada sección. Herramientas y Lenguajes de Programación 04-05 7 2. Existe un gran número de nombres de dominio y direcciones IP en Internet, por lo que es deseable un servicio que permita asociar un nombre con la dirección correspondiente. Dicho servicio se conoce con el nombre de DNS (Servicio de Nombres de Dominio Domain Name Service). Un ejemplo de este servicio es la utilidad UNIX nslookup. Utilizando nslookup, se puede encontrar el nombre de dominio de una dirección IP o viceversa, la dirección IP de un nombre de dominio. Haciendo uso de la clase InetAddress: Escriba un programa Java (Nslookup.java) que muestre la dirección IP de una máquina dado su nombre. Usage: java Nslookup <hostname> Escriba un programa Java (IPtoname.java) que dada la dirección IP de una máquina muestre su nombre. Usage: java IPtoname <IP address> 3. Partiendo del Ejemplo 3 de la sección 2, escriba un applet Java (TestAppletURL.java) que contenga un campo de texto (TextField) y un botón (Button). En le campo de texto se introducirá la dirección de una página web. Al pulsar el botón se cargará en el navegador que ejecuta el applet la página especificada. El fichero html en el que se incrusta el applet es TestAppletURL.html