Trabajo en Red

El siguiente programa es un ejemplo sencillo de c�mo establecer una conexi�n entre un programa cliente y otro servidor utilizando sockets. La clase Socket del paquete java.net es una implementaci�n independiente de la plataforma de un cliente para un enlace de comunicaci�n de dos v�as entre un cliente y un servidor. La clase Socket se sit�a en la parte superior de una implementaci�n dependiente de la plataforma, ocultando los detalles de los sistemas particulares a un programa Java. Utilizando la clase java.net.Socket en lugar de tratar con c�digo nativo, los programas Java pueden comunicarse a trav�s de la red de una forma independiente de la plataforma.

Este programa cliente, EchoTest, conecta con el Echo del servidor (en el port 7) mediante un socket. El cliente lee y escribe a trav�s del socket. EchoTest env�a todo el texto tecleado en su entrada estandard al Echo del servidor, escribiendole el texto al socket. El servidor repite todos los caracteres recibidos en su entrada desde el cliente de vuelta a trav�s del socket al cliente. El programa cliente lee y muestra los datos pasados de vuelta desde el servidor.

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

public class EchoTest {
    public static void main(String[] args) {
        Socket echoSocket = null;
        DataOutputStream os = null;
        DataInputStream is = null;
        DataInputStream stdIn = new DataInputStream(System.in);

        try {
            echoSocket = new Socket("taranis", 7);
            os = new DataOutputStream(echoSocket.getOutputStream());
            is = new DataInputStream(echoSocket.getInputStream());
        } catch (UnknownHostException e) {
            System.err.println("Don't know about host: taranis");
        } catch (IOException e) {
            System.err.println("Couldn't get I/O for the connection to: taranis");
        }

        if (echoSocket != null && os != null && is != null) {
            try {
                String userInput;

                while ((userInput = stdIn.readLine()) != null) {
                    os.writeBytes(userInput);
                    os.writeByte('\n');
                    System.out.println("echo: " + is.readLine());
                }
                os.close();
                is.close();
                echoSocket.close();
            } catch (IOException e) {
                System.err.println("I/O failed on the connection to: taranis");
            }
        }
    }
}

Paseemos a trav�s del programa e investiguemos las cosas interesantes.

Las siguientes tres l�neas de c�digo dentro del primer bloque try del m�todo main() son cr�ticos -- establecen la conexi�n del socket entre el cliente y el servidor y abre un canal de entrada y un canal de salida sobre el socket.

echoSocket = new Socket("taranis", 7);
os = new DataOutputStream(echoSocket.getOutputStream());
is = new DataInputStream(echoSocket.getInputStream());

La primera l�nea de esta secuencia crea un nuevo objeto Socket y lo llama echoSocket. El constructor Socket utilizado aqu� (hay otros tres) requiere el nombre de la m�quina y el n�mero de puerto al que quiere conectarse. El programa de ejemplo utiliza el host taranis, que es el nombre de una m�quina (hipot�tica) de nuestra red local. Cuando teclees y ejecutes este programa en tu m�quina, deber�as cambiar este nombre por una m�quina de tu red. Asegurate de que el nombre que utiliza tienes el nombre IP totalmente cualificado de la m�quina a la que te quieres conectar. El segundo argumento es el n�mero de puerto. El puerto n�mero 7 es el puerto por el que escucha el Echo del servidor.

La segunda l�nea del c�digo anterior abre un canal de etnrada sobre el socket, y la tercera l�nea abre un canal de salida sobre el mismo socket. EchoTest s�lo necesita escribir en el stream de salida y leer del stream de entrada para comunicarse a trav�s del socket con el servidor. El resto del programa hace esto. Si no est�s familiarizado con los streams de entrada y salida, podr�as querer leer Streams de Entrada y Salida.

La siguiente secci�n de c�digo lee desde el stream de entranda estandard de EchoTest (donde el usuario teclea los datos) una l�nea cada vez. EchoTest escribe inmediatamente la entada seguida por un car�cter de nueva l�nea en el stream de salida conectado al socket.

String userInput;

while ((userInput = stdIn.readLine()) != null) {
    os.writeBytes(userInput);
    os.writeByte('\n');
    System.out.println("echo: " + is.readLine());
}

La �ltima l�nea del bucle while lee una l�nea de informaci�n desde el stream de entrada conectado al socket. El m�todo readLine() se bloquea hasta que el servidor haya devuelto la informaci�n a EchoTest. Cuando readline() retorna, EchoTest imprime la informaci�n en la salida estandard.

Este bloque contin�a -- EchoTest lee la entrada del usuario, la env�a al servidor Echo, obtiene una respuesta desde el servidor y la muestra -- hasta que el usuario teclee un car�cter de final de entrada.

Cuando el usuario teclea un car�cter de fin de entrada, el bucle while termina y el programa contin�a ejecutando las siguientes l�neas de c�digo.

os.close();
is.close();
echoSocket.close();

Estas l�nea de c�digo caen en la categor�a de limpieza del hogar. Un programa con buen comportamienteo, se limpia a s� mismo y este programa tiene buen comportamiento. Estas tres l�neas de c�digo cierran las streams de entrada y salida conectados al socket, y cierra la conexi�n del socket con el servidor. El orden es importante -- debe cerrar los streams conectados a un socket antes de cerrar �ste.

Este programa cliente tiene un comportamiento correcto y sencillo porque el servidor Echo implementa un protocolo sencillo. El cliente env�a texto al servidor, y el servidor lo devuelve. Cuando tus programas clientes hablen con servidores m�s complicados como un servidor http, tu programa cliente tambi�n ser� m�s complicado. Si embargo, las cosas b�sicas son las que has visto en este programa.

  1. Abrir un socket.
  2. Abrir un stream de entrada y otro de salida hacia el socket.
  3. Leer y escribir a trav�s del socket de acuerdo al protocolo del servidor.
  4. Cerrar los Streams.
  5. Cerrar el socket.

S�lo el paso 3 ser� diferente de un cliente a otro, dependiendo del servidor. Los otros pasos permanecen inalterables.

.�Tambi�n puede ver

java.net.Socket

COMPARTE ESTE ARTÍCULO

COMPARTIR EN FACEBOOK
COMPARTIR EN TWITTER
COMPARTIR EN LINKEDIN
COMPARTIR EN WHATSAPP