Anuncios

Bienvenidos sean a este post, hoy continuaremos con el post anterior y hasta aqui hemos hablado del concepto de networking en Java que es la posibilidad de ejecutar una aplicacion entre distintos dispositivos y todas ellas comunicadas por una misma red.

Anuncios

El concepto de cliente/servidor, sobre las clase Socket y la clase SocketServer y hoy hablaremos sobre la clase InetAddress, y algunos metodos, tambien haremos un ejemplo de un cliente/servidor para entender el concepto, comencemos con la clase InetAddress.

Anuncios

La clase InetAddress representa una direccion de protocolo de internet (IP), a continuacion enlistaremos algunos de los metodos disponibles por esta clase:

  • static InetAddress getByAddress(byte[] addr), devuelve un objeto InetAddres dada la direccion IP en crudo
  • static InetAddress getByAddress(String host, byte[] addr), crea una InetAddres basado en el nombre del host y la direccion IP informados
  • static InetAddress getByName(String host), determina la direccion IP de un host en base al nombre informado
  • String getHostAddress(), devuelve la direccion IP en una representacion textual de tipo String
  • String getHostName(), consigue el nombre del host para esta direccion IP
  • static InetAddress getLocalHost(), devuelve el local host
  • String toString(), convierte la direccion IP a tipo String
Anuncios

Nuestro siguiente paso sera sobre un ejemplo de tipo cliente/servidor, para ello crearemos dos programas, uno de cliente llamado Cliente.java y otro llamado Server.java comencemos con el cliente:

Cliente.java

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

public class Cliente
{
        public static void main(String[] args)
        {
                String serverName = args[0];
                int port = Integer.parseInt(args[1]);

                try
                {
                        System.out.println("Conectando a " + serverName
                                        + " en el puerto " + port);
                        Socket cliente = new Socket(serverName, port);

                        System.out.println("Recien conectado a "
                                        + cliente.getRemoteSocketAddress());
                        OutputStream salidaAserver = cliente.getOutputStream();
                        DataOutputStream salida = new
                                                DataOutputStream(salidaAserver);
                        salida.writeUTF("Hola desde " + cliente
                                                .getLocalSocketAddress());
                        InputStream entDesdeServer = cliente.getInputStream();
                        DataInputStream entrada = new
                                                DataInputStream(entDesdeServer);
                        System.out.println("Servidor dice "
                                                + entrada.readUTF());
                        cliente.close();
                }
                catch (IOException e)
                {
                        e.printStackTrace();
                }
        }
}
Anuncios

Para este ejemplo utilizaremos dos series de paquetes: java.net.* y java.io.*, las cuales nos permitiran utilizar el Socket y los Stream respectivamente, primero crearemos una variable llamada serverName a la cual asignaremos el primer argumento, nuestra siguiente variable llamada port le asignaremos el segundo argumento, de esto lo hablaremos luego, despues utilizaremos try/catch, en el try mostraremos primero un mensaje donde indicamos a quien nos conectamos, luego crearemos un objeto de tipo Socket llamado Cliente donde le pasaremos la informacion de nuestro servidor y puerto, mostraremos un mensaje donde nos conectamos, en este caso obtendremos la direccion remota por medio de getRemoteSocketAddress(), crearemos un objeto de tipo OutputStream llamada a salidaAserver para la cual usaremos getOutputStream() para nuestro cliente, luego crearemos un objeto llamado salida del tipo DataOutputStream a la cual por medio del constructor le enviaremos el OutputStream del server, despues mostraremos un mensaje para el cual usaremos el getLocalSocketAddress() para obtener la direccion local, despues crearemos un objeto llamado entDesdeServer del tipo InputStream tambien por medio de getInputStream obtendremos la entrada desde el lado del servidor, al igual que antes usaremos en este caso DataInputStream para crear un objeto llamado entrada y enviaremos el dato almacenado en entDesdeServer, para mostrar un mensaje desde el socket de la entrada por medio de readUTF(), despues cerraremos el cliente, en el catch mostraremos un mensaje de la pila si ocurre algun error, pasemos a ver el codigo del servidor:

Server.java

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

public class Server extends Thread
{
        private ServerSocket serverSocket;

        public Server(int port) throws IOException
        {
                serverSocket = new ServerSocket(port);
                serverSocket.setSoTimeout(30000);
        }

        public void run()
        {
          while(true)
          {
            try
            {
                System.out.println("Esperando al cliente en el puerto "
                                + serverSocket.getLocalPort() + "...");
                Socket server = serverSocket.accept();

                System.out.println("Recien conectado a " + server.
                                                getRemoteSocketAddress());
                DataInputStream entrada = new DataInputStream(
                                                server.getInputStream());
                System.out.println(entrada.readUTF());
                DataOutputStream salida = new DataOutputStream(
                                                server.getOutputStream());
                salida.writeUTF("Gracias por conectarte a "
                        + server.getLocalSocketAddress() + "\nAdios!!!");
                server.close();
            }
            catch (SocketTimeoutException s)
            {
                System.out.println("Tiempo de espera expirado!!!");
                break;
            }

            catch (IOException e)
            {
                e.printStackTrace();
            }
          }
        }

        public static void main(String[] args)
        {
                int port = Integer.parseInt(args[0]);
                try
                {
                        Thread t = new Server(port);
                        t.start();
                }
                catch (IOException e)
                {
                        e.printStackTrace();
                }
        }
}
Anuncios

En el caso del server vamos a tener los dos paquetes de nuevo, java.net y java.io, despues haremos que esta clase extienda a Threads, crearemos un objeto llamado serverSocket del tipo ServerSocket, tendremos un constructor donde recibira un atributo el cual representara a nuestro puerto y en el cual se lo pasaremos a serverSocket por medio de su constructor y tambien le agregaremos un tiempo de expiracion por medio de setSoTimeOut(), despues tendremos un metodo llamado run(), en el cual tendremos un try/catch donde habra un while el cual quedara bucleando siempre que este en true, mostraremos un mensaje de espera, luego crearemos un objeto llamado server y por medio de serverSocket utilizaremos accept(), si accepto la conexion mostrara de la conexion remota por medio de getRemoteSocketAddress(), despues crearemos un objeto llamado entrada de tipo DataInputStream y utilizaremos a getInputStream() donde mostraremos el mensaje obtenido por medio de readUTF(), nuestro siguiente paso sera crear un objeto llamado salida de DataOutputStream y en este caso despues por medio de este objeto usaremos el metodo writeUTF() donde enviaremos un mensaje a la salida del socket remoto, por ultimo cerramos al server, despues nos queda el primer catch que se activara en caso de un tiempo expirado y nos mostrara un mensaje en pantalla, el siguiente catch es por si ocurre un error de I/O y nos mostrara la descripcion de la pila, despues pasamos al main donde tendremos una variable llamada port a la cual le asignaremos el primer argumento, e Integer.parseInt se encargaran de convertir ese dato en tipo entero, luego crearemos un objeto de tipo Thread llamado t para asignarle por medio de nuestro constructor el valor del puerto para el SocketServer y despues por medio de start() lo iniciaremos, deberemos compilar los dos programas previamente y asumiendo que no ocurrio ningun error primero deberemos ejecutar nuestros programas de la siguiente manera si estan probando desde un linux:

$ java Server 9999 | java Cliente localhost 9999
Nota: Si lo prueban desde un Windows les recomiendo ejecutarlos en dos ventanas de DOS separadas, ejecutando primero el Server y luego el cliente.

Al hacerlo (en Linux) obtendran la siguiente salida:

tinchicus@dbn001vrt:~/programacion/java/codigo$ java Server 9999 | java Cliente localhost 9999
Conectando a localhost en el puerto 9999
Recien conectado a localhost/127.0.0.1:9999
Servidor dice Gracias por conectarte a /127.0.0.1:9999
Adios!!!
tinchicus@dbn001vrt:~/programacion/java/codigo$
Anuncios

Como pueden ver no nos mostro el mensaje del server pero si creo el socket y nuestro cliente pudo conectarse exitosamente, y observen como nos devolvio la notificacion creada en el servidor.

Anuncios

En resumen, hoy hemos terminado de ver la clase faltante (InetAddress), hemos visto un ejemplo de un cliente, un ejemplo de un servidor, como pudimos obtener informacion uno de otro y como pudimos enviar informacion uno de otro, espero les haya sido util sigueme en tumblr, Twitter o Facebook para recibir una notificacion cada vez que subo un nuevo post en este blog, nos vemos en el proximo post.

Anuncios

Tengo un Patreon donde podes acceder de manera exclusiva a material para este blog antes de ser publicado, sigue los pasos del link para saber como.

Tambien podes donar

Es para mantenimiento del sitio, gracias!

$1.00