TCP/IP

El modelo TCP/IP organiza las comunicaciones en capas. En el nivel de transporte encontramos dos protocolos principales:

  • TCP: Garantiza la entrega ordenada de datos estableciendo una conexión previa entre emisor y receptor.
  • UDP: Envía datagramas independientes sin garantía de orden ni de entrega.

Paquete java.net

El paquete java.net proporciona dos niveles de API:

  • API de bajo nivel: Direcciones IP (InetAddress), sockets e interfaces de red.
  • API de alto nivel: URIs, URLs (URL) y conexiones (URLConnection).

Clase InetAddress

InetAddress representa una dirección IP. Tiene dos subclases: Inet4Address (IPv4) e Inet6Address (IPv6).

Métodos principales:

Método Descripción
getByName(String host) Obtiene la dirección IP a partir del nombre de host
getLocalHost() Devuelve la dirección del host local
getHostName() Devuelve el nombre del host
getHostAddress() Devuelve la dirección IP como cadena
getAllByName(String host) Devuelve todas las IPs asociadas a un nombre de host

Ejemplo InetAddress

import java.net.*;

public class TestInetAddress {
    public static void main(String[] args) {
        InetAddress dir = null;
        System.out.println("===========================================");
        System.out.println("SALIDA PARA LOCALHOST: ");
        try {
            dir = InetAddress.getByName("PC-ProfeB02");
            pruebaMetodos(dir);
            System.out.println("==========================================");
            System.out.println("SALIDA PARA UNA URL:");
            dir = InetAddress.getByName("www.google.es");
            pruebaMetodos(dir);
            System.out.println("\tDIRECCIONES IP PARA: " + dir.getHostName());
            InetAddress[] direcciones = InetAddress.getAllByName(dir.getHostName());
            for (int i = 0; i < direcciones.length; i++)
                System.out.println("\t\t"+direcciones[i].toString());
            System.out.println("==========================================");
        } catch (UnknownHostException e1) {
            e1.printStackTrace();
        }
    }

    private static void pruebaMetodos(InetAddress dir) {
        System.out.println("\tMetodo getByName(): " + dir);
        InetAddress dir2;
        try {
            dir2 = InetAddress.getLocalHost();
            System.out.println("\tMetodo getLocalHost(): " + dir2);
        } catch (UnknownHostException e) {
            e.printStackTrace();
        }
        System.out.println("\tMetodo getHostName(): "+dir.getHostName());
        System.out.println("\tMetodo getHostAddress(): "+ dir.getHostAddress());
        System.out.println("\tMetodo toString(): " + dir.toString());
        System.out.println("\tMetodo getCanonicalHostName(): " + dir.getCanonicalHostName());
    }
}

Clase URL

La clase URL representa un localizador de recursos uniforme. Se puede construir de varias formas:

import java.net.*;

public class Ejemplo1URL {
    public static void main(String[] args) {
        URL url;
        try {
            System.out.println("Constructor simple para una URL:");
            url = new URL("http://docs.oracle.com/");
            Visualizar(url);

            System.out.println("Otro constructor simple para una URL:");
            url = new URL("http://localhost/PFC/gest/cligestion.php?S=3");
            Visualizar(url);

            System.out.println("Const. para protocolo + URL + directorio");
            url = new URL("http", "docs.oracle.com", "/javase/7");
            Visualizar(url);

            System.out.println("Constructor para protocolo + URL + puerto + directorio:");
            url = new URL("http", "docs.oracle.com", 80, "/javase/7");
            Visualizar(url);

            System.out.println("Constructor para un objeto URL y un directorio:");
            URL urlBase = new URL("http://docs.oracle.com/");
            url = new URL(urlBase, "/javase/7/docs/api/java/net/URL.html");
            Visualizar(url);
        } catch (MalformedURLException e) {
            System.out.println(e);
        }
    }

    private static void Visualizar(URL url) {
        System.out.println("\tURL completa: " + url.toString());
        System.out.println("\tgetProtocol(): " + url.getProtocol());
        System.out.println("\tgetHost(): " + url.getHost());
        System.out.println("\tgetPort(): " + url.getPort());
        System.out.println("\tgetFile(): " + url.getFile());
        System.out.println("\tgetUserInfo(): " + url.getUserInfo());
        System.out.println("\tgetPath(): " + url.getPath());
        System.out.println("\tgetAuthority(): " + url.getAuthority());
        System.out.println("\tgetQuery(): " + url.getQuery());
        System.out.println("==============================================");
    }
}

Leer el contenido de una URL

import java.net.*;
import java.io.*;

public class Ejemplo2URL {
    public static void main(String[] args) {
        URL url = null;
        try {
            url = new URL("http://www.elaltozano.es");
        } catch (MalformedURLException e) {
            e.printStackTrace();
        }
        BufferedReader in;
        try {
            InputStream inputstream = url.openStream();
            in = new BufferedReader(new InputStreamReader(inputstream));
            String inputLine;
            while ((inputLine = in.readLine()) != null)
                System.out.println(inputLine);
            in.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

Clase URLConnection

URLConnection es una clase abstracta que facilita la comunicación bidireccional con una URL, permitiendo tanto leer como escribir datos.

Lectura básica con URLConnection

import java.net.*;
import java.io.*;

public class Ejemplo1urlCon {
    public static void main(String[] args) {
        URL url = null;
        URLConnection urlCon = null;
        try {
            url = new URL("http://www.elaltozano.es");
            urlCon = url.openConnection();
            BufferedReader in;
            InputStream inputStream = urlCon.getInputStream();
            in = new BufferedReader(new InputStreamReader(inputStream));
            String inputLine;
            while ((inputLine = in.readLine()) != null)
                System.out.println(inputLine);
            in.close();
        } catch (MalformedURLException e) { e.printStackTrace(); }
        catch (IOException e) { e.printStackTrace(); }
    }
}

Envío de datos a un script PHP

import java.io.*;
import java.net.*;

public class Ejemplo2urlCon {
    public static void main(String[] args) {
        try {
            URL url = new URL("http://localhost/DAM2PSP/vernombre.php");
            URLConnection conexion = url.openConnection();
            conexion.setDoOutput(true);
            String cadena = "nombre=Maria Jesús&apellidos=Ramos Martin";

            PrintWriter output = new PrintWriter(conexion.getOutputStream());
            output.write(cadena);
            output.close();

            BufferedReader reader = new BufferedReader(new InputStreamReader(conexion.getInputStream()));
            String linea;
            while ((linea = reader.readLine()) != null) {
                System.out.println(linea);
            }
            reader.close();
        } catch (MalformedURLException me) {
            System.err.println("MalformedURLException: " + me);
        } catch (IOException ioe) {
            System.err.println("IOException: " + ioe);
        }
    }
}

Consultar campos de cabecera

import java.net.*;
import java.io.*;
import java.util.*;

public class Ejemplo3urlCon {
    @SuppressWarnings("rawtypes")
    public static void main(String[] args) throws Exception {
        String cadena;
        URL url = new URL("http://localhost/2014/vernombre.html");
        URLConnection conexion = url.openConnection();
        System.out.println("Direccion [getURL()]: " + conexion.getURL());
        Date fecha = new Date(conexion.getLastModified());
        System.out.println("Fecha ultima modificacion [getLastModified()]: " + fecha);
        System.out.println("Tipo de Contenido [getContentType()]: " + conexion.getContentType());
        System.out.println("===========================================================");
        System.out.println("TODOS LOS CAMPOS DE CABECERA CON getHeaderFields(): ");

        Map camposcabecera = conexion.getHeaderFields();
        Iterator it = camposcabecera.entrySet().iterator();
        while (it.hasNext()) {
            Map.Entry map = (Map.Entry) it.next();
            System.out.println(map.getKey() + " : " + map.getValue());
        }
        System.out.println("============================================ ");
        System.out.println("CAMPOS 1 Y 4 DE CABECERA:");
        System.out.println("getHeaderField(1) => " + conexion.getHeaderField(1));
        System.out.println("getHeaderField(4) => " + conexion.getHeaderField(4));
        System.out.println("============================================");
        System.out.println("CONTENIDO DE [url.getFile()]: " + url.getFile());

        BufferedReader pagina = new BufferedReader(new InputStreamReader(url.openStream()));
        while ((cadena = pagina.readLine()) != null) {
            System.out.println(cadena);
        }
    }
}