jueves, 6 de diciembre de 2012

Construccion de un Servidor TCP/IP


1.1.1.        La clase Servidor TCP/IP
Veamos el código que presentamos en el siguiente ejemplo, donde desarrollamos un   mínimo   servidor   TCP/IP,   para   el   cual   desarrollaremos   después   su contrapartida cliente TCP/IP. La aplicación servidor TCP/IP depende de una clase de comunicaciones proporcionada por Java: ServerSocket. Esta clase realiza la mayor parte del trabajo de crear un servidor.

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintStream;
import java.net.ServerSocket;
import java.net.Socket;

public class Servidor {


    public static void main(String [] args) {

        ServerSocket  s; //Socket servidor
        Socket  sc; //Socket cliente

        PrintStream  p; //Canal de escritura
        BufferedReader  b; //Canal de Lectura

        String  mensaje;

        try {
            //Creo el socket server
            s = new ServerSocket (9999);

            //Invoco el metodo accept del socket servidor, me devuelve una referencia al socket cliente
            sc = s.accept();

            //Obtengo una referencia a los canales de escritura y lectura del socket cliente
            b = new BufferedReader ( new InputStreamReader  ( sc.getInputStream() ) );
            p = new PrintStream  ( sc.getOutputStream() );

            while ( true ) {
                //Leo lo que escribio el socket cliente en el canal de lectura
                mensaje = b.readLine();
                System .out.println(mensaje);

                //Escribo en canal de escritura el mismo mensaje recibido
                p.println(mensaje);

                if ( mensaje.equals("by")) {
                    break;
                }
            }

            p.close();
            b.close();

            sc.close();
            s.close();
        } catch (IOException  e) {
            System .out.println("No puedo crear el socket");
        }
    }

}


1.1.2.        La clase Cliente TCP/IP
El lado cliente de una aplicación TCP/IP descansa en la clase Socket. De nuevo, mucho del trabajo necesario para establecer la conexión lo ha realizado la clase Socket. Vamos a presentar ahora el código de nuestro cliente más simple, que encaja con el servidor presentado antes. El trabajo que realiza este cliente es que todo lo que recibe del servidor lo imprime por la salida estándar del sistema.


import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintStream;
import java.net.Socket;
import java.net.UnknownHostException;
public class Cliente {

    public static void main(String [] args) {

        Socket  s;
        PrintStream  p;
        BufferedReader  b;

        String  host = "localhost";
        int port = 9999;
        String  respuesta;

        //Referencia a la entrada por consola (System.in)
        BufferedReader  in = new BufferedReader (new InputStreamReader (System .in));

        try {

            //Creo una conexion al socket servidor
            s = new Socket (host,port);

            //Creo las referencias al canal de escritura y lectura del socket
            p = new PrintStream (s.getOutputStream());
            b = new BufferedReader  ( new InputStreamReader  ( s.getInputStream() ) );

            while ( true ) {
                //Ingreso un String por consola
                System .out.print("Mensaje a enviar: ");

                //Escribo en el canal de escritura del socket
                p.println( in.readLine() );

                //Espero la respuesta por el canal de lectura
                respuesta = b.readLine();
                System .out.println(respuesta);
                if ( respuesta.equals("by")) {
                    break;
                }
            }
            
            p.close();
            b.close();
            s.close();

        } catch (UnknownHostException  e) {
            System .out.println("No puedo conectarme a " + host + ":" + port);
        } catch (IOException  e) {
            System .out.println("Error de E/S en " + host + ":" + port);
        }
    }
}

2 comentarios: