Sockets Java

download Sockets Java

of 39

Transcript of Sockets Java

  • LUIS MENGUAL (c)

    Interfaces de Programacin para Sofware

    de Comunicaciones

    Sockets en Java

  • LUIS MENGUAL (c)

    Interfaces de Programacin (I)

    En la mayora de las implementaciones la arquitectura TCP/IP reside en el S.O.

    Los estndares TCP/IP no especifican los detalles de como aplicaciones software interactan con el protocolo TCP/IP

    Cada S.O. Puede ofrecer interfaces distintos Las aplicaciones deberan funcionar independientemente

    de la Interfaz de Programacin utilizada Los programas de aplicacin interactan con TCP/IP con

    llamadas al sistema (Unix, MW) o a travs de mquinavirtual de Java con clases y mtodos

    ModeradorNotas de la presentacinEn la mayora de las implementaciones el protocolo TCP/IP reside en el sistema operativo. Por tanto, si una aplicacin quiere usar la arquitectura TCP/IP debe interactuar con el sistema operativo. Es decir, debe de existir una Interfaz de Programacin de Aplicaciones (API, Application Programming Interface) que se le ofrece al desarrollador de aplicaciones mediante la cual poder utilizar las funcionalidades de la Arquitectura TCP/IP y, por lo tanto, poder construir software de comunicaciones. Se tratara de un conjunto de funciones, clases, constructores y/o mtodos que se le ofrecera al desarrollador de aplicaciones para integrar en su cdigo de la aplicacin.Los estndares TCP/IP no especifican los detalles de como el software de aplicacin interacta con el protocolo software TCP/IP; ellos slo sugieren la funcionalidad requerida y dejan a los diseadores de sistema la eleccin de los detalles.Las aplicaciones desarrolladas en distintos lenguajes de programacin y en distintos sistemas operativos deberan funcionar entre s aunque la interfaz de programacin que utilizaron fuera diferente.

  • LUIS MENGUAL (c)

    En la prctica solo existen pocos interfaces para programas de aplicacin (APIs*):

    INTERFACE SOCKETS : PARA S.O. UNIX DE BERKELEY 4.3BSD INTERFACE TLI : DEFINIDO POR AT&T COMO INTERFACE PARA EL UNIX SYSTEM V

    INTERFAZ WINDOWS SOCKETS: PARA S.O. WINDOWS INTERFAZ SOCKETS EN JAVA: MULTIPLATAFORMA

    Funcionalidad de un interfaz: Reservar recursos para la comunicacin Especificar los puntos de comunicacin locales y remotos Iniciar una conexin (cliente) Esperar una conexin entrante (servidor) Enviar o recibir datos Determinar cuando llegan datos Terminar una conexin Abortar la comunicacin Manejar condiciones de errores Liberacin de recursos cuando finaliza la comunicacin

    *API: Application Program Interface

    Interfaces de Programacin (II)

    ModeradorNotas de la presentacinEn la prctica no existen muchas interfaces de programacin para el desarrollo de software de comunicaciones. La interfaz sockets de Berkeley fue la primera desarrollada en cdigo C y en sistema operativo UnixEn 1980 the Advanced Research Projects Agency (ARPA) fund un grupo en la universidad de California en Berkeley para transportar el software TCP/IP al S.O. Unix. Como parte del proyecto estaba crear un interfaz que las aplicaciones pudieran usar para las comunicaciones. Ellos decidieron usar las llamadas al sistema Unix existentes siempre que fuera posible y aadir nuevas llamadas para soportar las funciones de TCP/IP que no fueran fcilmente asimilables a las ya existentes. El resultado fue conocido como interface socket y el sistema es conocido como Unix de Berkeley o BSD (Berkeley Software Distribution) Unix.Posteriormente surgieron otras interfaces de programacin como la interfaz Windows Sockets (lenguaje C, sistema operativo Windows), Interfaz TLI (C y en sistema operativo Unix) o la interfaz de sockets de java (multiplaforma e independiente del sistema operativo).Desde el desarrollo de la primera interfaz de programacin los llamados sockets de Berkeley se ha mantenido el concepto de socket como un identificador de fichero (como cualquier otro del SO), pero implicado exclusivamente en la comunicaciones. Es decir, las escrituras y lecturas en este fichero se van a traducir en enviar o recibir datos de una entidad remota utilizando por debajo la arquitectura TCP/IP. Los sockets permiten al programador abstraerse de los detalles de bajo nivel de la red, como el nivel fsico, el tamao de los paquetes etc. Esta abstraccin es inmensamente til y se ha trasladado desde su origen el S.O. Unix de Berkeley, a los S.O. Windows y por supuesto a Java.Las funciones de cualquier Interfaz de Programacin para el desarrollo de Software de Comunicaciones debe permitir establecer una comunicacin entre entidades remotas y en el caso de TCP debe permitir adems establecer una conexin entre ellas. Funciones adicionales deberan proporcionar al programador informacin del estado de las conexiones o comunicaciones establecidas.

  • LUIS MENGUAL (c)

    TCP / IP

    INTERFAZRED

    APLICACIONES

    APISOCKETS

    Interfaces de Programacin (III)

    ModeradorNotas de la presentacinLas Interfaces de Programacin de Aplicaciones (API, Application Programming Interface) se encuentran situadas encima del protocolo de transporte como se indica en la figura. El programador puede elegir el protocolo de transporte adecuado a sus aplicaciones TCP o UDP y en funcin de ello adecuar el cdigo de sus aplicaciones mediante el API seleccionado.

  • LUIS MENGUAL (c)

    FUNCIONES DEL SISTEMA LLAMADAS POR LAS APLICACIONES

    APLICACIN 1 APLICACIN 2 APLICACIN N

    SISTEMA OPERATIVO CONTENIENDO EL PROTOCOLO SOFTWARE TCP/IP

    INTERFAZ DE LLAMADAS ALSISTEMA

    APLICACIONES

    PROTOCOLOSOFTWARE

    Interfaces de Programacin (V)

    ModeradorNotas de la presentacinLa figura representa el mecanismo de llamadas al sistema que utilizan la mayora de los S.O. para transferir el control entre los programas de aplicacin y los procedimientos del S.O. que suministran servicios. Para un programador las llamadas al sistema se le aparecen como llamadas a funciones.Cuando una aplicacin invoca una llamada al sistema, el control pasa desde la aplicacin, a travs del interface de llamadas al sistema al S.O. El S.O. dirije las llamadas entrantes a un procedimiento interno que ejecuta la operacin pedida. Una vez que se ha completado el procedimiento interno, el control retorna a travs del interfaz de llamadas al sistema a la aplicacin la cual entonces continua ejecutndose.

  • LUIS MENGUAL (c)

    Interface Sockets (I)Sockets de Berkeley

    El interface sockets de Berkeley proporciona una serie defunciones en cdigo c que implementan las comunicaciones dered pudiendo usar varios protocolos

    Un socket como un fichero es identificado por undescriptor

    Unix localiza los descriptores de sockets en la misma tablade descriptores de ficheros

    Una aplicacin no puede tener un descriptor de fichero y de socketscon el mismo valor

    Unix BSD contiene la funcin socket para crear un socketsimilar a la funcin open para crear un descriptores deficheros

    Se utilizaran las primitivas convencionales e/s deunix y se incluirn otras nuevas

    Se extender el conjunto de descriptores de ficheros creando ficheros paracomunicaciones de red

    Se extender el uso de las llamadas al sistema write y read a los nuevosdescriptores de comunicaciones

    ModeradorNotas de la presentacinDebido a que los diseadores de Berkeley queran tener la posibilidad de acomodar mltiples protocolos y no slo TCP/IP definieron un conjunto de funciones que soportaran las comunicaciones en red de un modo general y usar parmetros para hacer del protocolo TCP/IP un caso especial.Un socket es un fichero especial y sobre el se realizan operaciones de lectura y escritura (read/write). Una operacin de escritura sobre ese fichero significa que se envan datos a una entidad remota. Una operacin de lectura significa que se reciben datos de una entidad remota.En definitiva, el interface socket de Berkeley proporciona una serie de funciones generalizadas para soportar las comunicaciones en red usando muchos posibles protocolos.

  • LUIS MENGUAL (c)

    Cuando una aplicacin llama a la funcin socket el S.O. Crea unaestructura de datos con parte de la informacin necesaria para lacomunicacin y crea un puntero a esa estructura de datos en la tablade descriptores

    Despus de crear el socket la aplicacin hace mas llamadas alsistema para completar la informacin que necesita el socket paraestablecer una comunicacin

    TABLA DE DESCRIPTORES UNA POR PROCESO

    ESTRUCTURA DATOS PARA SOCKET

    FAMILIA : PF_INET

    SERVICIO: SOCK_STREAM

    LOCAL IP:

    REMOTO IP:

    PUERTO LOCAL:

    PUERTO REMOTO :

    Interface Sockets (II)Sockets de Berkeley

    ModeradorNotas de la presentacinComo en el caso de los ficheros cada socket activo es identificado por un pequeo nmero entero llamado descriptor de socket. UNIX localiza los descriptores de sockets en la misma tabla de descriptores de ficheros como si fuera uno ms descriptor de fichero. No puede haber un descriptor de fichero y de socket con el mismo nmero.En definitiva un socket se puede definir como un fichero especial sobre el que se puede leer y escribir que se va a utilizar especficamente para las comunicaciones entre procesos.La llamada al sistema socket crea un socket. Una vez que el socket ha sido creado la aplicacin debe hacer llamadas al sistema adicionales para especificar los detalles de la comunicacin concreta (protocolo, nmero de puerto).Una vez que un socket ha sido creado puede ser usado para esperar una conexin entrante o iniciar una conexin. Un socket usado por un servidor para esperar una conexin entrante se llama socket pasivo, mientras que un socket usado por un cliente para iniciar la conexin se llama socket activo. La nica diferencia entre los sockets activos y pasivos se haya en como son usados por las aplicaciones; los sockets son creados del mismo modo inicialmente.

  • LUIS MENGUAL (c)

    Comunicacin TCP/IP (I)

    [Proto., Dir. IP Local, Pto. Local, Dir. IP Remota, Pto. Remoto]

    ASOCIACIN:

    MEDIA-ASOCIACIN

    ModeradorNotas de la presentacinUna comunicacin TCP/IP tiene lugar cuando se materializa una asociacin. Una asociacin es una quntupla de 5 elementos:El protocolo de transporte a utilizar (TCP o UDP), el puerto desde que accede un cliente (puerto local), direccin IP donde est el servidor y, finalmente el puerto donde est el servidor esperando las peticiones de los clientes.Inicialmente tanto el cliente como el servidor configuran una media asociacin: El servidor con un protocolo concreto (TCP o UDP) se empieza a ejecutar en un puerto y en una direccin IP a la espera de la llegada de un cliente. El servidor pues constituye una media asociacin.El cliente inicialmente crea una media asociacin configurando un protocolo, un puerto local desde donde acceder al servidor y una direccin IP. El cliente a su vez utiliza funciones (o mtodos de clases) para configurar la direccin IP y el puerto del servidor con quien se quiere comunicar. Si la comunicacin tiene xito se crea ahora una asociacin nica que contiene ahora los 5 elementos (protocolo, IP local, Puerto local, IP remota, Puerto Remoto).

  • LUIS MENGUAL (c)

    140.100.1.1/10000

    CLIENTE

    200.100.1.1/5000

    SERVIDOR

    SOLICITUD COMUNICACIN

    140.100.1.1/10000

    CLIENTE

    200.100.1.1/5000

    SERVIDOR

    SERVIDOR

    HILO /HIJO

    (PROTO,140.100.1.1, 10000) (PROTO,200.100.1.1, 10000)

    Comunicacin TCP/IP (II)

    ModeradorNotas de la presentacinEn la figura se observa como inicialmente un cliente y un servidor crean una media asociacin. A continuacin se intenta establecer la comunicacin. Si se ha tenido xito se crea una asociacin entre el cliente y el servidor.Hay muchas clases de servidores. En la figura se muestra el ejemplo de tener un servidor concurrente. Cuando recibe la peticin de un cliente se crea un hilo o un hijo para atender la peticin del cliente.

  • LUIS MENGUAL (c)

    Interfaz Sockets en Java (I)

    Implementa en java el interfaz original de los sockets de Berkeley

    Las funciones en C del interfaz sockets de Berkeley se convierten en clases y mtodos en java

    Independiente del sistema operativo Compatible con los sockets de Berkeley

    ModeradorNotas de la presentacinLa interfaz sockets de java es un conjunto de clases y mtodos escritos en java que implementan el software de comunicaciones de programas escritos en java.La interfaz sockets de java reproduce en el entorno java todas las funcionalidades implementadas en los sockets de Berkeley sustituyendo funciones escritas en lenguaje C para sistema operativo Unix por clases y mtodos escritos en java y, por consiguiente, capaces de operar en cualquier sistema operativo.Los interfaces de programacin para software de comunicaciones deben de ser, a su vez, compatibles. Es decir, un software cliente implementado en cdigo C utilizando la interfaz de los sockets de Berkeley debe poder comunicarse con un software servidor hecho en java y viceversa.

  • LUIS MENGUAL (c)

    La interfaz sockets en java permite crear un canal de comunicaciones de forma bidireccional

    Para que esta comunicacin se materialice es necesario que se cree una asociacin de 5 elementos: Protocolo, Dir IP Local, Pto Local, Dir IP

    Remota, Pto Remoto Es el procedimiento ms utilizado en las

    arquitecturas Cliente-Servidor

    Interfaz Sockets en Java (II)

    ModeradorNotas de la presentacinEn definitiva, podemos decir que la interfaz sockets en java permite crear un canal de comunicaciones de forma bidireccional. Para que esta comunicacin se materialice es necesario que se cree una asociacin de 5 elementos: Protocolo, Direccin IP Local, Puerto Local, Direccin IP Remota, Puerto Remoto. Las distintas clases, constructores y mtodos ofrecidos por la interfaz sockets de java nos van a permitir ir construyendo sucesivamente esta asociacin para poder establecer la comunicacin final.La interfaz sockets de java es uno de los procedimientos ms utilizados en las arquitecturas Cliente-Servidor.

  • LUIS MENGUAL (c)

    Hay dos tipos de sockets: Stream sockets (orientados a conexin):

    Clases Socket, ServerSocket Datagram sockets (no orientados a conexin):

    Clases DatagramSocket, DatagramPacket Las operaciones sobre un socket son

    diferentes en el cliente y en el servidor Las clases de comunicaciones en java estn

    en el paquete java.net

    Interfaz Sockets en Java (III)

    ModeradorNotas de la presentacinBsicamente hay dos formas mediante las cuales tener una comunicacin entre entidades remotas. Una forma es estableciendo una conexin entre estas dos entidades finales. Es decir, utilizando el protocolo TCP de la arquitectura TCP/IP. Esta forma de comunicacin se denomina Stream sockets.Otra forma de comunicacin entre entidades remotas no requiere establecer una conexin previa entre ambas. Es decir, estaramos utilizando en este caso el protocolo UDP de la arquitectura TCP/IP. Esta segunda opcin se denomina Datagram sockets.Las clases, constructores y mtodos de la interfaz de comunicaciones de java se invocan dependiendo del tipo de comunicacin que queramos establecer y dependiendo de la entidad que se trate cliente o servidor (en una arquitectura cliente-servidor). Todas estas clases del software de comunicaciones de java estn contenidas en el paquete java.net.

  • LUIS MENGUAL (c)

    Clase Socket (I)

    ModeradorNotas de la presentacinLa clase Socket contenida en el paquete java.net es la primera clase que tendra que utilizar un cliente para establecer las comunicaciones con un servidor. Se suele decir que el cliente crea un socket activo (que inicia un proceso de conexin) y el servidor crea un socket pasivo (que espera una conexin de un cliente).Esta clase tiene numerosos constructores y mtodos que facilitan al desarrollador la tarea de implementar una aplicacin del lado del cliente.

  • LUIS MENGUAL (c)

    Clase Socket (II)

    ModeradorNotas de la presentacinEn la figura se muestran los distintos constructores que posee la clase socket. Los sockets de java proporcionan una total flexibilidad a la hora de establecer los cinco elementos de la asociacin.A modo de ejemplo analicemos el constructor: Socket(inetAddress adresss, intport). Automticamente el constructor de la clase socket intenta crear una asociacin en la que el protocolo de comunicaciones es TCP, la direccin IP y el puerto local se establecen automticamente y la direccin IP y el puerto remoto se especifican como parmetros en el constructor.En definitiva, este constructor nos permite establecer una conexin TCP con una mquina remota asociada a la direccin IP especificada en el primer parmetro del constructor y un puerto asociado al segundo parmetro.Las clases de comunicaciones de java nos permiten una gran flexibilidad a la hora de programar nuestra comunicaciones.As por ejemplo el constructor Socket() crea un socket no conectado. es decir, crea una infraestructura de comunicaciones que todava no tiene implementados los cinco elementos de la asociacin. Distintos mtodos de la clase nos permitirn establecer la conexin ms adelante.

  • LUIS MENGUAL (c)

    Clase Socket (III)

    ModeradorNotas de la presentacinLos distintos mtodos de la clase socket nos permiten, por un lado, enviar y recibir datos desde y hacia una entidad remota y, por otro, tener informacin relativa a la asociacin y conexin creada con la entidad remota.Respecto de los primeros mtodos podemos citar getOutputStream() y getInputStream(). Estos mtodos se utilizan para enviar datos a una entidad remota o para recibir datos de una entidad remota a travs de clases de tipo OutputStream e InputStream. OutputStream e InputStream son clases de java que permiten mandar los datos como array de bytes. Si quisiramos formatear los datos, es decir, mandar un dato tipo entero, un dato tipo long sera ms conveniente utilizar las clases DataOutputStream y DataInputStream.

    OutputStream Flujo_salida = socket.getOutputStream();InputStream Flujo_entrada = socket.getInputStream();DataOutputStream Flujo_s = new DataOutputStream(Flujo_salida);DataInputStream Flujo_e = new DataInputStream(Flujo_entrada);

    Respecto de otros mtodos, a modo de ejemplo, podemos citar el mtodo getPort() o el mtodo getInetAdress() que nos permiten obtener la direccin IP y el puerto de la entidad remota.

    int puerto_remoto=socket_cliente.getPort();System.out.println("puert remoto ....... "+puerto_remoto );InetAddress peer_adress= socket_cliente.getInetAddress();System.out.println("ip remoto ....... "+peer_adress );

  • LUIS MENGUAL (c)

    Clase ServerSocket (I)

    ModeradorNotas de la presentacinLa clase ServerSocket contenida en el paquete java.net es la primera clase que tendra que utilizar un servidor para establecer las comunicaciones con un cliente. Se suele decir que el servidor crea a partir de esta clase un socket pasivo a la espera de una conexin de un cliente.Esta clase tiene numerosos constructores y mtodos que facilitan al desarrollador la tarea de implementar una aplicacin del lado del servidor.

  • LUIS MENGUAL (c)

    Clase ServerSocket (II)

    ModeradorNotas de la presentacinEn la figura se muestran los distintos constructores que posee la clase ServerSocket. Los sockets de java proporcionan una total flexibilidad a la hora de establecer los cinco elementos de la asociacin.A modo de ejemplo analicemos el constructor: ServerSocket(intport). Automticamente el constructor de la clase ServerSocket intenta crear una media asociacin en la que el protocolo de comunicaciones es TCP, la direccin IP se toma automticamente del sistema y el puerto local se introduce como parmetro. Se puede decir que el servidor ha creado un socket pasivo y le ha incorporado tres elementos de una asociacin (media asociacin). La creacin de la clase ServerSocket sera la primera instruccin que tendra que invocar el software del servidor. A continuacin, en una situacin tpica, el servidor invocara el mtodo accept de la clase ServerSocket. Ahora el servidor est esperando en el mtodo accept de la clase ServerSocket la llegada de un cliente.

  • LUIS MENGUAL (c)

    ServerSocket socket_servidor = new ServerSocket(9999);

    while (true){

    Socket socket_sr = socket_servidor.accept();

    System.out.println("CLIENTE CONECTADO ....... ");

    OutputStream Flujo_salida = socket_sr.getOutputStream();InputStream Flujo_entrada = socket_sr.getInputStream();

    DataOutputStream Flujo_s = new DataOutputStream(Flujo_salida);DataInputStream Flujo_e = new DataInputStream(Flujo_entrada);

    //read//readint/readlong/write/writeint/writelong (flujo_s, Flujo_e)

    }

    Clase ServerSocket (II)Estructura cdigo servidor

    ModeradorNotas de la presentacinEn la figura se muestra la estructura bsica del cdigo java de un servidor. Ntese que la primera lnea de cdigo representara la creacin de la clase ServerSocket() y la construccin de un socket pasivo TCP esperando en el puerto 9999.A continuacin se implementa un bucle en el cual est el cdigo del servidor esperando la llegada de un cliente. La primera lnea del bucle es un invocacin al mtodo accept de la clase ServerSocket() . En esta lnea de cdigo se queda bloqueado el servidor hasta la llegada de un cliente. Al llegar un cliente el cdigo se desbloquea y el mtodo accept crea un nuevo socket llamado socket_sr. Este nuevo socket (clase Socket) contiene los cinco elemento de la asociacin y sobre el se pueden realizar operaciones de lectura y escritura que equivalen a enviar o recibir datos de la entidad remota.El envo y recepcin de la informacin en forma de bytes entre el cliente y el servidor se puede realizar a travs de las clases OutputStream y InputStream. Estas clases de java nos permiten mandar los datos como array de bytes. Si quisiramos formatear los datos, es decir, por ejemplo mandar un dato tipo entero o un dato tipo long sera ms conveniente utilizar las clases DataOutputStream y DataInputStream.

  • LUIS MENGUAL (c)

    Ejemplo1_TCP (I)Envo de cadena como array

    ModeradorNotas de la presentacinPara construir la aplicacin nos creamos un proyecto Eclipse Conexin_TCP_Simple_1 en el que aadimos los ficheros (clases) Cliente y Servidor y les incorporamos el mtodo public static void main como ya hemos hecho anteriormente en el mdulo de introduccin a Eclipse.

  • LUIS MENGUAL (c)

    Cliente Servidor

    Conexin TCP eco

    Socket socket= new Socket(ip,pto);

    .

    ServerSocket serversocket = new ServerSocket(9999);Socket socket = serversocket.accept();

    Ejemplo1_TCP (II)Envo de cadena como array

    ModeradorNotas de la presentacinVamos a construir la primera aplicacin cliente servidor implementada con la interfaz sockets de java orientada a conexin (protocolo TCP).Como se ve en la figura la estructura de la programacin en java de las comunicaciones es sencilla:En el cliente utilizamos la clase Socket() para establecer la conexin y en el servidor la clase ServerSocket() y el mtodo accept para esperar la llegada de conexiones de clientes. Como parmetros de la clase Socket del cliente ponemos la direccin IP y el puerto del servidor. Como parmetros de la clase ServerSocket() del servidor ponemos simplemente el puerto donde el servidor espera las conexiones de los clientes.

  • LUIS MENGUAL (c)

    Cliente Servidor

    Conexin TCP

    Socket socket_cliente= new Socket(dirip,ptoint);

    OutputStream Flujo_salida = socket_cliente.getOutputStream();InputStream Flujo_entrada = socket_cliente.getInputStream();

    DataOutputStream Flujo_s = new DataOutputStream(Flujo_salida);DataInputStream Flujo_e = new DataInputStream(Flujo_entrada);

    //calculamos la longitud del mensaje a enviarString mensaje = "mensaje cliente";int longitud_mensaje= mensaje.length();

    //creamos un array de bytes con esa longitudbyte[] Mensaje_enviar =new byte[longitud_mensaje];

    //Convertimos el mensaje en array de bytes y lo metemos// en el array creado

    Mensaje_enviar=mensaje.getBytes();//enviamos la longitud del mensaje al servidor

    Flujo_s.writeInt(longitud_mensaje);//enviamos el mensaje como un array de bytes

    Flujo_s.write(Mensaje_enviar,0,longitud_mensaje);

    socket_cliente.close();

    ServerSocket socket_servidor = new ServerSocket(10001);

    while (true) {Socket socket_sr = socket_servidor.accept();

    OutputStream Flujo_salida = socket_sr.getOutputStream();InputStream Flujo_entrada = socket_sr.getInputStream();

    DataOutputStream Flujo_s = new DataOutputStream(Flujo_salida);DataInputStream Flujo_e = new DataInputStream(Flujo_entrada);//recibimos la longitud del mensaje del clienteint num_recibido = Flujo_e.readInt();//creamos un array de bytes con esa longitudbyte[] Mensaje_recibido =new byte[num_recibido];//recibimos el mensaje como un array de bytesint bytes_leidos = Flujo_e.read(Mensaje_recibido);

    System.out.println("MENSAJE RECIBIDO: "+new String(Mensaje_recibido)+" Leidos " +bytes_leidos+ " bytes");}

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

    Ejemplo1_TCP (III)Envo de cadena como array

    ModeradorNotas de la presentacinEl cdigo del primer ejemplo que vamos a implementar nos va a permitir enviar una cadena de caracteres desde el cliente al servidor. Esta cadena de caracteres la vamos a convertir en un array de bytes y, a continuacin, la vamos a enviar al servidor. En la figura aparecen descritos los pasos que vamos a implementar para la codificacin de este ejemplo:En el cliente hacemos los siguientes pasos:Calculamos la longitud del mensaje a enviar.Nos creamos un array de bytes con esa longitud.Enviamos esta longitud al servidor (mtodo WriteInt, DataOutputStream).Enviamos el mensaje como un array de bytes escribiendo en el socket.En el servidor hacemos los siguientes pasos:Recibimos la longitud del mensaje (mtodo ReadInt, DataInputStream).Creamos un array de bytes de la longitud recibida.Recibimos (leemos del socket) los bytes que llegan del cliente.

  • LUIS MENGUAL (c)

    TEMA 3: EJERCICIO 1Proyecto Ejemplo1_TCP: ENVIO_CADENA_ARRAY*

    En este proyecto debemos tener el cdigo de un cliente y unservidor TCP de acuerdo a las especificaciones de la pginaanterior

    El fichero del cliente y del servidor estarn en el mismo proyectode Eclipse

    El cliente debe de enviar una cadena de texto en forma de Arrayde Bytes.

    El Servidor recibe el array de bytes e imprime en pantalla lacadena de texto resultante

    *El alumno deber construir el proyecto especificado en la pgina 21

  • LUIS MENGUAL (c)

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

    public class CLIENTE_ECO {

    public static void main(String[] args){

    try {String dirip;InputStreamReader Flujo = new InputStreamReader(System.in);BufferedReader teclado = new BufferedReader(Flujo);System.out.print("Direccion IP: " );dirip=teclado.readLine();

    System.out.print("Puerto:" );Scanner sc =new Scanner(System.in);String pto= sc.nextLine();int ptoint= Integer.parseInt(pto);Socket socket= new Socket(dirip,ptoint);

    Ejemplo2_TCP (I)Cliente-Servidor Eco

    Cdigo Cliente

    ModeradorNotas de la presentacinEn este segundo ejemplo TCP vamos a construir un cliente-servidor de eco. En la figura se muestra parte del cdigo del cliente.Utilizamos de forma ilustrativa dos clases BufferedReader y Scanner para leer por teclado la direccin IP y puerto a las cuales se va a conectar nuestro cliente.

  • LUIS MENGUAL (c)

    InputStream inputstream = System.in;InputStreamReader inputstreamreader = new InputStreamReader(inputstream);BufferedReader bufferedreader = new BufferedReader(inputstreamreader);

    OutputStream outputstream = socket.getOutputStream();OutputStreamWriter outputstreamwriter = new OutputStreamWriter(outputstream);BufferedWriter bufferedwriter = new BufferedWriter(outputstreamwriter);

    InputStream inputstream2 = socket.getInputStream();InputStreamReader inputstreamreader2 = new InputStreamReader(inputstream2);BufferedReader bufferedreader2 = new BufferedReader(inputstreamreader2);String string = null;while (!(string = bufferedreader.readLine()).equals("")) {

    bufferedwriter.write(string + '\n');bufferedwriter.flush();System.out.println(bufferedreader2.readLine() );

    }

    socket.close();

    } catch (Exception e) { System.out.println("ERROR CAPTURADO:"+e.toString()); }

    }

    Ejemplo2_TCP (II)Cliente-Servidor Eco

    Cdigo Cliente

    ModeradorNotas de la presentacinEn esta figura se muestra cmo construimos los streams de entrada/salida para que el socket TCP lea caracteres de la entrada estndar, los enve por el socket y espere recibir la contestacin en eco del servidor.As, utilizamos el objeto bufferedreader para leer del teclado los caracteres que introduce el cliente y que espera recibir en eco. Utilizamos el objeto bufferedwriter para mandar esos caracteres por el socket creado. Ntese que el objeto bufferedwriter viene del objeto outputstreamwriter que a su vez viene del objeto outputstream creado con el mtodo getOutputStream de la clase Socket.Finalmente, utilizamos el objeto bufferedreader2 para recibir los caracteres en eco que nos devuelve el servidor. Ntese que el objeto bufferedreader2 viene del objeto inputstreamreader2 que a su vez viene del objeto inputstream2 creado con el mtodo getInputStream de la clase Socket.El cliente puede salir del bucle while introduciendo un retorno de carro.

  • LUIS MENGUAL (c)

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

    public class SERVIDOR_ECO {public static void main(String[] args) throws IOException {

    ServerSocket serversocket = null;Socket socket = null ;PrintStream p;

    while (true)

    {

    try {

    serversocket = new ServerSocket(9999);System.out.println("SERVIDOR ECO ESPERANDO PTO 9999 ....... ");

    socket = serversocket.accept();

    Ejemplo2_TCP (III)Cliente-Servidor Eco

    Cdigo Servidor

    ModeradorNotas de la presentacinLa figura muestra parte del cdigo del servidor de eco. Inicialmente el servidor crea el socket pasivo TCP mediante el objeto ServerSocket(), inicializndolo en el puerto 9999.

    A continuacin se invoca el mtodo accept() de la clase ServerSocket dejando al servidor en un espera bloqueante a la espera de una peticin de un cliente...

  • LUIS MENGUAL (c)

    InputStream inputstream = socket.getInputStream();InputStreamReader inputstreamreader = new InputStreamReader(inputstream);BufferedReader bufferedreader = new BufferedReader(inputstreamreader);String string = null;

    OutputStream outputstream = socket.getOutputStream();OutputStreamWriter outputstreamwriter = new OutputStreamWriter(outputstream);BufferedWriter bufferedwriter = new BufferedWriter(outputstreamwriter);

    while ((string = bufferedreader.readLine()) != null) {System.out.println(string);Thread.currentThread().sleep(1000); bufferedwriter.write(string + '\n');bufferedwriter.flush();

    }

    socket.close();serversocket.close();

    }//trycatch (Exception e) {System.out.println("ERROR CAPTURADO:"+e.toString());socket.close();serversocket.close(); }

    }

    }//main

    }//class

    Ejemplo2_TCP (IV)Cliente-Servidor Eco

    Cdigo Servidor

    ModeradorNotas de la presentacinEn esta figura se muestra el resto del cdigo del servidor de eco.En el servidor utilizamos el objeto bufferedreader para recibir los caracteres que nos enva el cliente y que debemos de reenviar en eco. Ntese que el objeto bufferedreader viene del objeto inputstreamreader que a su vez viene del objeto inputstream creado con el mtodo getInputStream de la clase Socket.Utilizamos el objeto bufferedwriter para mandar esos caracteres por el socket creado y devolvrselos en eco al cliente. Ntese que el objeto bufferedwriter viene del objeto outputstreamwriter que a su vez viene del objeto outputstream creado con el mtodo getOutputStream de la clase Socket.

  • LUIS MENGUAL (c)

    TEMA 3: EJERCICIO 2Proyecto Ejemplo2_TCP: CLIENTE_SERVIDOR_ECO*

    En este proyecto debemos tener el cdigo de un cliente y unservidor TCP de acuerdo a las especificaciones de la pginasanteriores

    El fichero del cliente y del servidor estarn en el mismo proyectode Eclipse

    El cliente debe de enviar una cadena de texto por teclado El Servidor devolver en eco al cliente la cadena de texto recibida

    *El alumno deber construir el proyecto especificado entre las pginas 23 a 26

  • LUIS MENGUAL (c)

    Cliente Servidor

    Conexin TCP

    Socket socket_cliente= new Socket(dirip,ptoint);

    OutputStream Flujo_salida = socket_cliente.getOutputStream();InputStream Flujo_entrada = socket_cliente.getInputStream();

    DataOutputStream Flujo_s = new DataOutputStream(Flujo_salida);DataInputStream Flujo_e = new DataInputStream(Flujo_entrada);

    File mi_fichero = new File (01.crt); //calculamos la longitud del fichero a enviar

    >........................