Download Clases Java para comunicaciones en red

Document related concepts
no text concepts found
Transcript
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