You are on page 1of 39

Interfaces de Programación para Sofware de Comunicaciones Sockets en Java

LUIS MENGUAL (c)

Interfaces de Programación (I)
• En la mayoría de las implementaciones la arquitectura TCP/IP reside en el S.O. • Los estándares TCP/IP no especifican los detalles de como aplicaciones software interactúan con el protocolo TCP/IP • Cada S.O. Puede ofrecer interfaces distintos • Las aplicaciones deberían funcionar independientemente de la Interfaz de Programación utilizada • Los programas de aplicación interactúan con TCP/IP con llamadas al sistema (Unix, MW) o a través de máquina virtual de Java con clases y métodos

LUIS MENGUAL (c)

Interfaces de Programación (II)
• En la práctica solo existen pocos interfaces para programas de aplicación (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 comunicación Especificar los puntos de comunicación locales y remotos Iniciar una conexión (cliente) Esperar una conexión entrante (servidor) Enviar o recibir datos Determinar cuando llegan datos Terminar una conexión Abortar la comunicación Manejar condiciones de errores Liberación de recursos cuando finaliza la comunicación
LUIS MENGUAL (c)

*API: Application Program Interface

Interfaces de Programación (III) APLICACIONES API SOCKETS TCP / IP INTERFAZ RED LUIS MENGUAL (c) .

Interfaces de Programación (V) APLICACIÓN 1 APLICACIÓN 2 APLICACIÓN N APLICACIONES FUNCIONES DEL SISTEMA LLAMADAS POR LAS APLICACIONES INTERFAZ DE LLAMADAS AL SISTEMA SISTEMA OPERATIVO CONTENIENDO EL PROTOCOLO SOFTWARE TCP/IP PROTOCOLO SOFTWARE LUIS MENGUAL (c) .

Interface Sockets (I) “Sockets de Berkeley” • El interface sockets de Berkeley proporciona una serie de funciones en código c que implementan las comunicaciones de red pudiendo usar varios protocolos • Un socket como un fichero es identificado por un descriptor • Unix localiza los descriptores de sockets en la misma tabla de descriptores de ficheros – Una aplicación no puede tener un descriptor de fichero y de sockets con el mismo valor • Unix BSD contiene la función “socket” para crear un socket similar a la función open para crear un descriptores de ficheros • Se utilizaran las primitivas convencionales e/s de unix y se incluirán otras nuevas – – Se extenderá el conjunto de descriptores de ficheros creando ficheros para comunicaciones de red Se extenderá el uso de las llamadas al sistema write y read a los nuevos descriptores de comunicaciones LUIS MENGUAL (c) .

Crea una estructura de datos con parte de la información necesaria para la comunicación y crea un puntero a esa estructura de datos en la tabla de descriptores Después de crear el socket la aplicación hace mas llamadas al sistema para completar la información que necesita el socket para establecer una comunicación TABLA DE DESCRIPTORES UNA POR PROCESO ESTRUCTURA DATOS PARA SOCKET FAMILIA : PF_INET SERVICIO: SOCK_STREAM LOCAL IP: PUERTO LOCAL: REMOTO IP: PUERTO REMOTO : LUIS MENGUAL (c) • .O.Interface Sockets (II) “Sockets de Berkeley” • Cuando una aplicación llama a la función socket el S.

Pto. Dir. Dir.Comunicación TCP/IP (I) ASOCIACIÓN: [Proto. IP Remota. Remoto] MEDIA-ASOCIACIÓN LUIS MENGUAL (c) . Pto. Local.. IP Local.

1.1.100.1/5000 CLIENTE SERVIDOR HILO /HIJO SERVIDOR LUIS MENGUAL (c) .1.1.100. 10000) SERVIDOR (PROTO.1.1/10000 200.100.1/5000 CLIENTE (PROTO. 10000) 140.140.1.1.100.100.1/10000 SOLICITUD COMUNICACIÓN 200.1.200.Comunicación TCP/IP (II) 140.100.

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 métodos en java • Independiente del sistema operativo • Compatible con los sockets de Berkeley LUIS MENGUAL (c) .

Interfaz Sockets en Java (II) • La interfaz sockets en java permite crear un canal de comunicaciones de forma bidireccional • Para que esta comunicación se materialice es necesario que se cree una asociación de 5 elementos: – Protocolo. Dir IP Local. Dir IP Remota. Pto Remoto • Es el procedimiento más utilizado en las arquitecturas Cliente-Servidor LUIS MENGUAL (c) . Pto Local.

Interfaz Sockets en Java (III) • Hay dos tipos de sockets: – “Stream sockets” (orientados a conexión): Clases “Socket”. “ServerSocket” – “Datagram sockets” (no orientados a conexión): Clases “DatagramSocket”. DatagramPacket” • Las operaciones sobre un socket son diferentes en el cliente y en el servidor • Las clases de comunicaciones en java están en el paquete “java.net” LUIS MENGUAL (c) .

Clase Socket (I) LUIS MENGUAL (c) .

Clase Socket (II) LUIS MENGUAL (c) .

Clase Socket (III) LUIS MENGUAL (c) .

Clase ServerSocket (I) LUIS MENGUAL (c) .

Clase ServerSocket (II) LUIS MENGUAL (c) .

//read//readint/readlong/write/writeint/writelong (flujo_s. while (true) { Socket socket_sr = socket_servidor.. "). DataOutputStream Flujo_s = new DataOutputStream(Flujo_salida).. DataInputStream Flujo_e = new DataInputStream(Flujo_entrada).accept().println("CLIENTE CONECTADO . Flujo_e) } LUIS MENGUAL (c) .. System.. InputStream Flujo_entrada = socket_sr..getInputStream().Clase ServerSocket (II) Estructura código servidor ServerSocket socket_servidor = new ServerSocket(9999).getOutputStream(). OutputStream Flujo_salida = socket_sr..out.

“Envío de cadena como array” Ejemplo1_TCP (I) LUIS MENGUAL (c) .

Ejemplo1_TCP (II) “Envío de cadena como array” Conexión TCP eco Cliente Servidor Socket socket= new Socket(ip. ………………………………………………………………… LUIS MENGUAL (c) . …………………………………………. Socket socket = serversocket. ServerSocket serversocket = new ServerSocket(9999).accept().pto).

OutputStream Flujo_salida = socket_sr.ptoint). InputStream Flujo_entrada = socket_cliente. DataOutputStream Flujo_s = new DataOutputStream(Flujo_salida).getInputStream().getOutputStream(). Socket socket_cliente= new Socket(dirip.longitud_mensaje). DataInputStream Flujo_e = new DataInputStream(Flujo_entrada).accept().*. //creamos un array de bytes con esa longitud byte[] Mensaje_recibido =new byte[num_recibido]. DataInputStream Flujo_e = new DataInputStream(Flujo_entrada). System.net.writeInt(longitud_mensaje).*. ServerSocket socket_servidor = new ServerSocket(10001).getOutputStream(). //Convertimos el mensaje en array de bytes y lo metemos // en el array creado Mensaje_enviar=mensaje.readInt().getInputStream().out. DataOutputStream Flujo_s = new DataOutputStream(Flujo_salida).0.length().close().println("MENSAJE RECIBIDO: "+ new String(Mensaje_recibido)+" Leidos " + bytes_leidos+ " bytes").write(Mensaje_enviar. //enviamos el mensaje como un array de bytes Flujo_s.getBytes(). while (true) { Socket socket_sr = socket_servidor.net. Servidor import java. //creamos un array de bytes con esa longitud byte[] Mensaje_enviar =new byte[longitud_mensaje]. OutputStream Flujo_salida = socket_cliente. //calculamos la longitud del mensaje a enviar String mensaje = "mensaje cliente". //recibimos el mensaje como un array de bytes int bytes_leidos = Flujo_e. //recibimos la longitud del mensaje del cliente int num_recibido = Flujo_e.Ejemplo1_TCP (III) “Envío de cadena como array” Conexión TCP Cliente import java. //enviamos la longitud del mensaje al servidor Flujo_s. } LUIS MENGUAL (c) .read(Mensaje_recibido). socket_cliente. InputStream Flujo_entrada = socket_sr. int longitud_mensaje= mensaje.

Proyecto Ejemplo1_TCP: “ENVIO_CADENA_ARRAY”* *El alumno deberá construir el proyecto especificado en la página 21” TEMA 3: EJERCICIO 1 • En este proyecto debemos tener el código de un cliente y un servidor TCP de acuerdo a las especificaciones de la página anterior • El fichero del cliente y del servidor estarán en el mismo proyecto de Eclipse • El cliente debe de enviar una cadena de texto en forma de Array de Bytes. • El Servidor recibe el array de bytes e imprime en pantalla la cadena de texto resultante LUIS MENGUAL (c) .

net. public class CLIENTE_ECO { public static void main(String[] args) { try { String dirip.io.util. import java.out.Ejemplo2_TCP (I) “Cliente-Servidor Eco” Código Cliente import java.print("Direccion IP: " ). dirip=teclado. System. int ptoint= Integer.*.nextLine().out.*.*.readLine().ptoint). InputStreamReader Flujo = new InputStreamReader(System.parseInt(pto).print("Puerto:" ). import java. Scanner sc =new Scanner(System. String pto= sc. LUIS MENGUAL (c) . Socket socket= new Socket(dirip. BufferedReader teclado = new BufferedReader(Flujo). System.in).in).

println(bufferedreader2. System.readLine() ). BufferedWriter bufferedwriter = new BufferedWriter(outputstreamwriter). } socket.equals("")) { bufferedwriter.getOutputStream(). InputStream inputstream2 = socket.getInputStream(). InputStreamReader inputstreamreader2 = new InputStreamReader(inputstream2).Ejemplo2_TCP (II) “Cliente-Servidor Eco” Código Cliente InputStream inputstream = System. } } LUIS MENGUAL (c) .flush(). bufferedwriter.toString()). InputStreamReader inputstreamreader = new InputStreamReader(inputstream).write(string + '\n'). String string = null.in.out.close(). while (!(string = bufferedreader. OutputStreamWriter outputstreamwriter = new OutputStreamWriter(outputstream). BufferedReader bufferedreader = new BufferedReader(inputstreamreader). OutputStream outputstream = socket.println("ERROR CAPTURADO:"+e.readLine()). } catch (Exception e) { System.out. BufferedReader bufferedreader2 = new BufferedReader(inputstreamreader2).

System. "). PrintStream p. LUIS MENGUAL (c) .. public class SERVIDOR_ECO { public static void main(String[] args) throws IOException { ServerSocket serversocket = null.*.. import java.accept().io.out.*.println("SERVIDOR ECO ESPERANDO PTO 9999 .*.Ejemplo2_TCP (III) “Cliente-Servidor Eco” Código Servidor import java. socket = serversocket... import java.net.. Socket socket = null . while (true) { try { serversocket = new ServerSocket(9999).util..

Thread. }//try catch (Exception e) { System.sleep(1000). socket. BufferedReader bufferedreader = new BufferedReader(inputstreamreader).getOutputStream(). } socket.readLine()) != null) { System. InputStreamReader inputstreamreader = new InputStreamReader(inputstream).toString()).println(string).close().close(). String string = null. serversocket.close(). OutputStreamWriter outputstreamwriter = new OutputStreamWriter(outputstream). OutputStream outputstream = socket. serversocket.close().println("ERROR CAPTURADO:"+e. bufferedwriter.currentThread().out. BufferedWriter bufferedwriter = new BufferedWriter(outputstreamwriter).getInputStream().flush().Ejemplo2_TCP (IV) “Cliente-Servidor Eco” Código Servidor InputStream inputstream = socket. bufferedwriter.out. while ((string = bufferedreader.write(string + '\n'). } } }//main }//class LUIS MENGUAL (c) .

Proyecto Ejemplo2_TCP: “CLIENTE_SERVIDOR_ECO”* *El alumno deberá construir el proyecto especificado entre las páginas 23 a 26” TEMA 3: EJERCICIO 2 • En este proyecto debemos tener el código de un cliente y un servidor TCP de acuerdo a las especificaciones de la páginas anteriores • El fichero del cliente y del servidor estarán en el mismo proyecto de Eclipse • El cliente debe de enviar una cadena de texto por teclado • El Servidor devolverá en eco al cliente la cadena de texto recibida LUIS MENGUAL (c) .

< socket_cliente.getOutputStream().. //calculamos la longitud del fichero a enviar >……………………………………………………….. ServerSocket socket_servidor = new ServerSocket(10001).crt”).< int NumBytes_req_SR =0. while (true) { Socket socket_sr = socket_servidor. DataOutputStream Flujo_s = new DataOutputStream(Flujo_salida).getInputStream(). OutputStream Flujo_salida = socket_sr. DataOutputStream Flujo_s = new DataOutputStream(Flujo_salida) DataInputStream Flujo_e = new DataInputStream(Flujo_entrada)..close(). DataInputStream Flujo_e = new DataInputStream(Flujo_entrada).....< >……………………………………………………….< //enviamos la longitud del fichero que queremos enviar al servidor >……………………………………………………….getInputStream(). //recibimos la longitud del fichero que quiere enviar el cliente >………………………………………………………. InputStream Flujo_entrada = socket_cliente. InputStream Flujo_entrada = socket_sr. OutputStream Flujo_salida = socket_cliente.“Envío de Fichero corto: certificado digital” Conexión TCP Cliente Servidor Ejemplo3_TCP (I) Socket socket_cliente= new Socket(dirip.< //abrimos el fichero con “FileInputStream” y copiamos su contenido // al array de bytes “buffer_cliente” >……………………………………………………….accept()...< >……………………………………………………….< //creamos un array de bytes con esa longitud >……………………………………………………….< LUIS MENGUAL (c) .getOutputStream().< //creamos un fichero con “FileOutputStream” y en el copiamos //el array de bytes recibido >………………………………………………………. //recibimos el fichero como un array de bytes >……………………………………………………….< >………………………………………………………. File mi_fichero = new File (“01.< //enviamos el fichero como un array de bytes al servidor >……………………………………………………….< //creamos un array de bytes con esa longitud para almacenar //los datos del fichero que vamos a mandar al servidor >………………………………………………………..ptoint)...

Proyecto Ejemplo3_TCP: “ENVIO_FICHERO_CORTO”* *El alumno deberá construir el proyecto especificado en la página anterior (pág. • El fichero del cliente y del servidor estarán en el mismo proyecto de Eclipse • El cliente enviará un fichero (un certificado digital) al servidor • El Servidor recibirá el fichero como una array de bytes por la interfaz socket • El servidor construirá un fichero con el array de bytes recibido LUIS MENGUAL (c) .28) TEMA 3: EJERCICIO 3 • En este proyecto debemos tener el código de un cliente y un servidor TCP de acuerdo a las especificaciones de la página anterior.

// Se cambia el programa original para crear una // fábrica de sockets. ServerSocketFactory serverSocketFactory = ServerSocketFactory.ptoint).SocketFactory.getOutputStream(). InputStream Flujo_entrada = socket_cliente.. // Un servidor real manejaría más de un único cliente así. //Socket socket_cliente= new Socket(dirip. String mensaje = "mensaje cliente". // Ahora.createServerSocket(9999).accept(). Socket socket_sr = socket_servidor. OutputStream Flujo_salida = socket_sr. la fábrica ha de crear el socket de servidor.net.Ejemplo4_TCP (I) “Factoría Sockets” Conexión TCP Cliente import javax. ServerSocket socket_servidor = serverSocketFactory.SocketFactory. DataOutputStream Flujo_s = new DataOutputStream(Flujo_salida). String mensaje_rev = Flujo_e. Flujo_s.net.getDefault().. SocketFactory socketFactory = SocketFactory.createSocket(dirip. Socket socket_cliente = socketFactory.getInputStream().getDefault(). DataInputStream Flujo_e = new DataInputStream(Flujo_entrada). ptoint). LUIS MENGUAL (c) . DataInputStream Flujo_e = new DataInputStream(Flujo_entrada). DataOutputStream Flujo_s = new DataOutputStream(Flujo_salida). InputStream Flujo_entrada = socket_sr. // Ahora la fábrica crea el socket. Servidor import javax.getInputStream(). OutputStream Flujo_salida = socket_cliente. que luego se utiliza para crear sockets. //ServerSocket socket_servidor = new ServerSocket(9999).readUTF().getOutputStream(). // Se cambia la clase simpleSocketServer original para que utilice // ServerSocketFactory con el fin de crear sockets de servidor.writeUTF(mensaje).

Proyecto Ejemplo4_TCP: “FACTORIA_SOCKETS”* *El alumno deberá construir el proyecto especificado en la página anterior (pág.30) TEMA 3: EJERCICIO 4 • En este proyecto debemos tener el código de un cliente y un servidor TCP de acuerdo a las especificaciones de la página anterior • El fichero del cliente y del servidor estarán en el mismo proyecto de Eclipse • El cliente y el servidor utilizarán las clases “Socket” y “ServerSocket generadas a partir de factorías de sockets • El cliente enviará un cadena de caracteres utilizando el método “writeUTF()” de la clase “DataOutputStream()” • El Servidor recibirá la cadena de caracteres utilizando el método “readUTF()” de la clase “DatIntputStream()” LUIS MENGUAL (c) .

Comunicación UDP (I) Clase “DatagramSocket” LUIS MENGUAL (c) .

Comunicación UDP (II) Clase “DatagramSocket” LUIS MENGUAL (c) .

Comunicación UDP (III) Clase “DatagramPacket” LUIS MENGUAL (c) .

Comunicación UDP (IV) Clase “DatagramPacket” LUIS MENGUAL (c) .

paqueteEnvio = new DatagramPacket(datosDatagrama.send(paqueteRecepcion). 0. 0.out.getData().write(paqueteRecibido.length. socketCliente.write(paqueteRecepcion.send( paqueteEnvio ). System.getLength()). InetAddress DireccionHostServidor = InetAddress. socketServidor. datosDatagrama. paqueteRecepcion. 10001). paqueteRecibido.getData().512). socketCliente. socketServidor = new DatagramSocket(10001). while (true) { paqueteRecepcion= new DatagramPacket(new byte[512].receive( paqueteRecibido ). System. DireccionHostServidor. 512).Comunicación UDP (III) Comunicación UDP Cliente Servidor socketCliente = new DatagramSocket().receive(paqueteRecepcion).getByName("localhost").getLength()). socketServidor. } LUIS MENGUAL (c) .out. paqueteRecibido= new DatagramPacket(new byte[512].

Hilos en Java (I) LUIS MENGUAL (c) .

p.println("Hilo creado con éxito"). while (np<10) { System.Hilos en Java (II) “hilos. InputThread p = new InputThread("MI HILO ").*.println("Estoy en el padre " ). public class hilos1 { public static void main(String[] args) { int failed = 0 .java” import java. } int np=0. } //while while(true){} } } LUIS MENGUAL (c) .out. if (p != null) System. else { System.start().out. np++.println("Error en la creacion del Hilo").out. failed++.lang.

println("Estoy en el hilo hijo " ).out. int n=0.out.java” public class InputThread extends Thread{ String name. n++.Hilos en Java (II) “InputThread. else System.out. } InputThread(String s) { name = s. InputThread() { name = null.println("Nuevo hilo creado "). } public void run() { if (name == null) System. while (n<10) { System. }//WHILE } } LUIS MENGUAL (c) .println("Nuevo hilo cread con nombre: " + name).