Laboratorio de Redes de Comunicaciones Programación con Sockets en Java



Documentos relacionados
1.- FUNDAMENTOS FUNCIONAMIENTO GENÉRICO JAVA SOCKETS Creación de Streams de Entrada...7

UNIVERSIDADE DA CORUÑA Departamento de Tecnoloxías da Información e as Comunicacións LABORATORIO DE RC: TUTORIAL DE SOCKETS EN JAVA

Federico Peinado

Sockets en Java. Prof. Wílmer Pereira Universidad Simón Bolívar

UNIVERSIDAD POLITÉCNICA DE PACHUCA SOCKETS EN JAVA

Lab 01: Programación de Sockets en TCP

PROGRAMACIÓN ORIENTADA A OBJETOS (L40629) Sabino Miranda-Jiménez

COMUNICACIÓN ENTRE PROCESOS SOCKETS

Redes (IS20) Ingeniería Técnica en Informática de Sistemas. CAPÍTULO 8: El nivel de transporte en Internet

Curso de Redes Computadores 1 Tema 3 Introducción a la capa de transporte. Interfaz de programación en redes. Sockets.

Modelo de Objetos Distribuidos

Introducción a las Redes de Computadoras. Obligatorio

Práctica 4: Herencia. Objetivos:

Entrada y Salida con Java

ARQUITECTURAS CLIENTE/SERVIDOR

PROGRAMACIÓN CLIENTE-SERVIDOR MEDIANTE SOCKETS EN JAVA

UNIVERSIDAD CARLOS III DE MADRID DEPARTAMENTO DE INGENIERÍA TELEMÁTICA. Daniel Díaz Sánchez

Tema 4. Gestión de entrada/salida

EL MODELO DE ESTRATIFICACIÓN POR CAPAS DE TCP/IP DE INTERNET

Práctica III: Streams, Readers y Writers

Tema 4.1: - TRANSPORTE-

Capítulo 5. Programación de aplicaciones de red

Arquitecturas cliente/servidor

1. Definición de puerto 2. Sockets 3. Conceptos cliente/servidor 4. Definición de Stream 5. Concurrencia, multiprogramación y multitarea 6.

Práctica GESTIÓN Y UTILIZACIÓN DE REDES LOCALES. Curso 2001/2002. TCP/IP: protocolo TCP

Tema 1. Introducción a JAVA

4. Programación Paralela

PRACTICA CAPITULO 2 MODULO 1 PROTOCOLOS Y LA FUNCIONALIDAD DE LA CAPA DE APLICACIÓN

Arquitecturas cliente/servidor

TEMA: PROTOCOLOS TCP/IP

Sockets. Introducción. Las redes de computadoras permiten al usuario. Curso Propedéutico Maestría en Ciencias de la Computación BUAP

Programación Orientada a Objetos con Java

TELEPROCESO Y SISTEMAS DISTRIBUIDOS

COPIAS DE SEGURIDAD AUTOMÁTICAS DE DIRECCIONES CALLEÇPAÑA

Tema II. Sockets. Desarrollo de Aplicaciones para Internet Curso Miguel Reboiro Jato

INTRODUCCION. Tema: Protocolo de la Capa de aplicación. FTP HTTP. Autor: Julio Cesar Morejon Rios

INSTITUTO TECNOLÓGICO DE SALINA CRUZ. Fundamentos De Redes. Semestre Agosto-Diciembre Reporte De Lectura

Iptables, herramienta para controlar el tráfico de un servidor

7. Manejo de Archivos en C.

EJEMPLOS PROGRAMACIÓN SOCKET - JAVA

Introducción a la programación orientada a objetos

Sockets en Java. La Creatividad proviene de un conflicto de ideas. Uso de Sockets

(decimal) (hexadecimal) 80.0A.02.1E (binario)

PRACTICA CAPITULO 2 MODULO 1 PROTOCOLOS Y LA FUNCIONALIDAD DE LA CAPA DE APLICACIÓN

GUÍA Nro. 1 TECNOLOGÍA DE INTERNET. TIII PIII

Comunicación entre Procesos y Sockets

Aplicaciones Cliente/Servidor en Gambas Prof: Mileti, P.

RESUMEN DE CONCEPTOS BASICOS DE PROGRAMACION JAVA

Tutorial BMS Server Studio UDP

Programación Orientada a Objetos. Tema 7: Persistencia

Sockets (TCP) Tema 2.- Nivel de aplicación en Internet

Luis Villalta Márquez

Capítulo 5. Cliente-Servidor.

Comunicacion en Java. Alejandro Escobar

Las clases Java Socket y ServerSocket

Introducción de Sockets en C.

19. Packages o paquetes

INTERNET 4º ESO INFORMATICA / DEP. TECNOLOGIA

Gestion de archivos. Problemas al almacenar datos sólo en la memoria:

TEMA 2: FUNCIONAMIENTO DE INTERNET.

Problemas de Redes de Computadores. Conjunto de problemas 1


Creación y administración de grupos de dominio

Introducción a la programación con sockets en C

Contenidos. Archivos en C++ Archivos en C++ Introducción

Telnet Comunicaciones 1. Luis Alfredo da Silva Gregori Gonzalez Rhamin Elrhouate July 2014

Instalación y mantenimiento de servicios de Internet. U.T.3.- Servicio DNS

EL MODELO DE ESTRATIFICACIÓN POR CAPAS DE TCP/IP DE INTERNET

LABORATORIO DE RC: PRÁCTICA 4: IMPLEMENTACIÓN DE UN CLIENTE DE CORREO

La vida en un mundo centrado en la red

Introducción a las Redes de Computadoras

Objetivos de la práctica: - Practicar uso de ficheros: abrir, cerrar y tratamiento de información contenida en el fichero.

CAPITULO 3 MOVILIDAD EN LA NAVEGACIÓN Y ALMACENAMIENTO EN BASES DE DATOS

1 SOCKETS EN JAVA. Sistemas Distribuidos::Sockets en Java EUI-SG/INFOR.UVA.ES 1

SISTEMAS OPERATIVOS AVANZADOS

CFGM. Servicios en red. Unidad 5 Servicio FTP. 2º SMR Servicios en Red

Manual del Protocolo XML-RPC de Mensajería Negocios

Instructivo Outlook Mesa de ayuda Sistemas. Introducción

Capítulo V. Implementación

Propuesta de Portal de la Red de Laboratorios Virtuales y Remotos de CEA

REDES DE ÁREA LOCAL. APLICACIONES Y SERVICIOS EN WINDOWS

Uso del Shield Ethernet con Arduino

Universidad de Cantabria

Práctica 3ProgramacionRS232: Programación básica de la RS232

Java Inicial (20 horas)

Redes de área local: Aplicaciones y servicios WINDOWS

Práctica 5: Servidor web concurrente en Java

MICQ. Trabajo Práctico Final Seminario de Ingeniería en Informática I Facultad de Ingeniería, UBA. Junio Cátedra: Pablo Cosso

Cliente/Servidor en Java

Integración de Laboratorios Remotos en emersion

Instalar y configurar W3 Total Cache

MARTIN JARAMILLO PINO Proyecto Final Programación, creatividad y solución de problemas con Scratch

TELECOMUNICACIONES Y REDES

La interoperabilidad se consigue mediante la adopción de estándares abiertos. Las organizaciones OASIS y W3C son los comités responsables de la

Curso de Java POO: Programación orientada a objetos

Protocolos de red. IP: Internet Protocol

Servidor FTP. Ing. Camilo Zapata Universidad de Antioquia

Transcripción:

Laboratorio de Redes de Comunicaciones Programación con Sockets en Java Sockets orientados a conexión Sockets no orientados a conexión

Java: Distribuido Java se ha construido con extensas capacidades de interconexión TCP/IP. Existen librerías de rutinas para acceder e interactuar con protocolos como http y ftp. Esto permite a los programadores acceder a la información a través de la red con tanta facilidad como a los ficheros locales. Java en sí no es distribuido, sino que proporciona las librerías y herramientas para que los programas puedan ser distribuidos, es decir, que se corran en varias máquinas, interactuando. Octubre 2007 Laboratorio de Redes de Comunicaciones 2

Java: Distribuido Pensado para su aplicación en redes. Soporta varios niveles de conectividad en red: Permite abrir un URL RMI Permite trabajar con sockets Permite crear de forma sencilla, tanto aplicaciones cliente como servidor. Octubre 2007 Laboratorio de Redes de Comunicaciones 3

Clientes y servidores Aplicaciones Cliente/Servidor Cliente: Programa que ejecuta el usuario Solicita un servicio a una máquina Servidor: Ofrece un servicio a múltiples clientes Ejemplos: telnet, ftp, web, echo Octubre 2007 Laboratorio de Redes de Comunicaciones 4

Ejemplo: Servicio de telnet Ejecuta un telnet Servidor de telnet: telnetd Octubre 2007 Laboratorio de Redes de Comunicaciones 5

Conceptos básicos de redes En Internet se utiliza la pila de protocolos TCP/IP para el establecimiento y realización de conexiones, basado en un conjunto de protocolos organizados en diferentes niveles: Enlace / Red / Transporte / Aplicación. Normalmente, cuando se escriben aplicaciones Java en Red se programa a nivel de aplicación. Es posible realizar programas a más bajo nivel utilizando la API java.net => nivel de transporte => TCP /UDP. Capa de Aplicación (HTTP, ftp, telnet) Capa de Transporte (TCP, UDP) Capa de Red (IP) Capa de Enlace (Ethernet,...) Octubre 2007 Laboratorio de Redes de Comunicaciones 6

Capa de Transporte: TCP vs UDP TCP: Transmission Control Protocol Protocolo orientado a conexión Provee un flujo de bytes fiable entre dos ordenadores. Llegada en orden, correcta, sin perder nada. Protocolos del nivel de aplicación que usan TCP: telnet, http, ftp. UDP: User Datagram Protocol No orientado a conexión. Envía paquetes de datos (datagramas) independientes sin garantías. Protocolos del nivel de aplicación que usan UDP: tftp, ping. Permite broadcast. Octubre 2007 Laboratorio de Redes de Comunicaciones 7

Qué es un puerto? Un ordenador tiene una o varias conexiones físicas a la red. A través de esas conexiones recibe los datos dirigidos a la máquina. Cómo determinar a que aplicación enviar los datos? Puertos. TCP y UDP utilizan los puertos para dirigir los datos a la aplicación correcta de entre todas las que se estén ejecutando en la máquina. Los datos transmitidos a través de Internet contienen información de direccionamiento que identifica a la máquina y puerto a los que van dirigidos. La máquina se identifica a través de una dirección IP de 32 bits. Los puertos se identifican por un número de 16 bits. Puertos: Independientes para TCP y UDP. 16 bits Rango: 0 a 65535. Reservados: 0 a 1023 ( well known ports ) Para servicios conocidos: HTTP,FTP, No deberían ser utilizados por aplicaciones de usuario. Octubre 2007 Laboratorio de Redes de Comunicaciones 8

TCP Una aplicación servidora se registra en un puerto concreto. El servidor se registra en el sistema para recibir los datos dirigidos a ese puerto. El cliente se conecta con el servidor usando ese número de puerto. Sólo en el establecimiento de la conexión se precisa la IP+puerto. El resto de paquetes TCP sólo llevan un identificador de la conexión. Servidor p u e r t o TCP Cliente Octubre 2007 Laboratorio de Redes de Comunicaciones 9

UDP Una aplicación servidora se registra en un puerto concreto. El servidor se registra en el sistema para recibir los datos dirigidos a ese puerto. El cliente envía datagramas que contienen el número de puerto del destino asociado a la aplicación servidora. UDP enruta hacia la aplicación adecuada. En cada paquete UDP va toda la información necesaria para que enrute: IP+puerto Aplicación Aplicación Aplicación Puerto Puerto Puerto UDP # Puerto Datos Paquete Octubre 2007 Laboratorio de Redes de Comunicaciones 10

Clases para Redes en JDK Paquete java.net Clases Java para crear programas que utilicen TCP o UDP para comunicarse sobre Internet. Clases URL, URLConnection, Socket, ServerSocket Utilizan TCP para comunicaciones de red. Clases DatagramPacket, DatagramSocket, MulticastSocket Utilizan UDP para comunicaciones de red. Niveles de comunicación de red Bajo nivel: Aplicaciones cliente/servidor basadas en protocolos. Alto nivel: Acceso a recursos de red Octubre 2007 Laboratorio de Redes de Comunicaciones 11

Qué es un socket? Es un extremo de un enlace de comunicación bidireccional entre dos programas que se comunican por la red. Un socket se asocia a un número de puerto. Se identifica por dirección IP de la máquina + número de puerto. Existen en TCP y UDP. Octubre 2007 Laboratorio de Redes de Comunicaciones 12

Sockets TCP (1) Sockets orientados a conexión. El servidor se ejecuta en una máquina y crea un socket orientado a conexión ligado a un número de puerto específico. El servidor espera, escuchando por ese socket, a que los clientes hagan peticiones de conexión. El cliente conoce: La máquina donde se está ejecutando el servidor El puerto donde el servidor está escuchando. Servidor p u e r t o l i s t e n Petición de conexión p u e r t o Cliente Octubre 2007 Laboratorio de Redes de Comunicaciones 13

Sockets TCP (2) El cliente envía una petición de conexión al servidor, usando esa máquina y número puerto. Además, el cliente tiene que identificarse ante el servidor, por tanto al cliente se le asigna un puerto en su máquina, que será utilizado a lo largo de la conexión. Normalmente esta asignación la realiza el sistema. Si todo va bien el servidor acepta la conexión. El servidor obtiene un nuevo socket asociado al mismo puerto local que el original, y que tiene como otro extremo de la conexión la dirección y puerto del cliente. Es necesario crear un nuevo socket para atender al cliente, para poder seguir recibiendo peticiones de conexión a través del socket original. Octubre 2007 Laboratorio de Redes de Comunicaciones 14

Sockets TCP (3) En el lado cliente, si la conexión es aceptada, se obtiene un socket conectado con el servidor. A partir de ahí, cliente y servidor se comunican escribiendo y leyendo por sus respectivos sockets. Servidor p u e r t o l i s t e n Conexión p u e r t o Cliente Clases: java.net.socket: Implementa un extremo de una conexión bidireccional. java.net.serversocket: Implementa un socket que los servidores pueden utilizar para escuchar y aceptar peticiones de clientes. Octubre 2007 Laboratorio de Redes de Comunicaciones 15

Sockets UDP (1) Sockets NO orientados a conexión. Se envían y reciben paquetes independientes de información Clientes y servidores NO se conectan NO se garantiza la recepción del paquete ni el orden. Datagrama: Mensaje independiente, enviado a través de una red cuya llegada, tiempo de llegada y contenido no está garantizado. El servidor se ejecuta en una máquina y crea un socket no orientado a conexión que está ligado a un número de puerto específico. A partir de ahí el servidor recibe todos los datos enviados a ese puerto UDP, leyendo a través de ese socket. El cliente conoce: La máquina donde se está ejecutando el servidor El puerto asociado al servidor. Octubre 2007 Laboratorio de Redes de Comunicaciones 16

Sockets UDP (2) El cliente crea un socket no orientado a conexión ligado a un número de puerto específico y lo utiliza para enviar Datagramas al servidor. Normalmente la asignación del número de puerto en el cliente la hace el sistema. Los Datagramas enviados deben contener la dirección y número de puerto del servidor al que van dirigidos. Cuando un servidor recibe un Datagrama: Obtiene la dirección de la máquina del cliente y su número de puerto. Envía la respuesta al cliente creando un Datagrama dirigido a esa máquina y puerto. Clases: java.net.datagramsocket java.net.datagrampacket Octubre 2007 Laboratorio de Redes de Comunicaciones 17

Clase java.net.inetaddress: Direcciones IP Métodos estáticos: InetAddress getbyname(string host) Obtiene la dirección IP de la máquina Recibe el nombre de la máquina o su dirección IP como cadena. InetAddress[] getallbyname(string host) Otiene todas las direcciones IP de una máquina. Recibe el nombre de la máquina o su dirección IP como cadena. InetAddress getlocalhost(): Obtiene la dirección IP de la máquina en la que se está ejecutando. Método: public String gethostname() Devuelve el nombre de la máquina correspondiente a esta IP. Octubre 2007 Laboratorio de Redes de Comunicaciones 18

TCP Cliente (1) Operación: Crear un socket Establecer la conexión con el servidor Intercambio de datos (según protocolo): Abrir un flujo de entrada y otro de salida Escribir y leer de los flujos Cerrar los flujos Cerrar el socket Clase: java.net.socket Octubre 2007 Laboratorio de Redes de Comunicaciones 19

TCP Cliente (2) Creación y conexión del socket (java.net.socket). Al llamar al constructor se crea el socket y si se indica la dirección y puerto del servidor ya se conecta con la máquina y puerto indicados. Constructores: Socket() Socket(InetAddress dir, int puerto) Socket(InetAddress dir, int puerto, InetAddress dirlocal, int puertolocal) Socket(String nombre, int puerto) Socket(String nombre, int puerto, InetAddress dirlocal, int puertolocal) Métodos void bind(socketaddress bindpoint) void connect(socketaddress endpoint) void connect(socketaddress endpoint, int timeout) Octubre 2007 Laboratorio de Redes de Comunicaciones 20

TCP Cliente (3) Abrir flujos de datos del socket: Métodos: InputStream getinputstream() OutputStream getoutputstream() Recomendación (si se transmite TEXTO): Para la entrada de datos: BufferedReader InputStreamReader Método readline(). Para la salida de datos: PrintWriter Método println(). Octubre 2007 Laboratorio de Redes de Comunicaciones 21

TCP Cliente (4) Cierre de los flujos de lectura y escritura: Método: void close() Cierre del socket: Método: void close() Octubre 2007 Laboratorio de Redes de Comunicaciones 22

TCP Servidor (1) Operación: Crear un socket servidor Mientras (dure la ejecución del servidor) Esperar conexión de un cliente. Crear un socket conectado al cliente. Intercambio de datos (según protocolo). En otro hilo de ejecución?» Abrir un flujo de entrada y otro de salida» Leer y escribir de los flujos Cerrar los flujos Cerrar el socket Cerrar el socket servidor Clases: java.net.serversocket java.net.socket Octubre 2007 Laboratorio de Redes de Comunicaciones 23

TCP Servidor (2) Creación del socket servidor (java.net.serversocket) Al llamar al constructor se crea el socket servidor y si se indica el puerto ya se asocia a ese puerto. Constructores: ServerSocket() ServerSocket(int puerto) ServerSocket(int puerto, int backlog) backlog: Número de máximo de conexiones pendientes que aceptará el socket. ServerSocket(int puerto, int backlog, InetAddress dirip) dirip: Dirección por la que va a aceptar conexiones (en caso de que la máquina del servidor tenga más de una). Métodos: void bind(socketaddress endpoint) void bind(socketaddress endpoint, int backlog) Octubre 2007 Laboratorio de Redes de Comunicaciones 24

TCP Servidor (3) Esperar y aceptar conexiones: Método: Socket accept() Devuelve un Socket conectado al cliente que realizó la conexión. Abrir un flujo de entrada y otro de salida Ídem cliente. Leer y escribir en los flujos Ídem cliente. Octubre 2007 Laboratorio de Redes de Comunicaciones 25

Cerrar los flujos Ídem cliente. TCP Servidor (4) Cerrar el socket Ídem cliente. Cerrar el socket servidor. Método: void close() Octubre 2007 Laboratorio de Redes de Comunicaciones 26

UDP Cliente (1) Operación: Crear un socket no orientado a conexión. Intercambio de datos (según protocolo): Enviar y recibir Datagramas Cerrar el socket Clases: java.net.datagramsocket java.net.datagrampacket Octubre 2007 Laboratorio de Redes de Comunicaciones 27

UDP Cliente (2) Creación del socket (java.net.datagramsocket) Constructores: DatagramSocket() Normalmente se utiliza este en los clientes DatagramSocket(int puerto) DatagramSocket(int puerto, InetAddress dirip) Intercambio de datos Enviar: void send(datagrampacket) Recibir: void receive(datagrampacket) Establecer timeout para recibir. setsotimeout(int milisegundos) Cierre del socket: Método: void close() Octubre 2007 Laboratorio de Redes de Comunicaciones 28

UDP Cliente (3) Datagramas (java.net.datagrampacket): Constructores (para enviar): DatagramPacket(byte[] buf, int length, InetAddress addr, int port) DatagramPacket(byte[] buf, int offset, int length, InetAddress addr, int port) buf : array con los datos que se van a enviar offset: desplazamiento dentro del array de datos a enviar length: número de bytes a enviar addr: dirección IP del destino port: número de puerto del destino Constructores (para recibir): DatagramPacket(byte[] buf, int length) DatagramPacket(byte[] buf, int offset, int length) buf : array para almacenar los datos que se van a recibir offset: desplazamiento dentro del array de datos a recibir length: número máximo de bytes que se van a recibir Octubre 2007 Laboratorio de Redes de Comunicaciones 29

UDP Servidor (1) Operación: Crear un socket no orientado a conexión. Mientras (dure la ejecución del servidor) Intercambio de datos (según protocolo): Recibir y enviar Datagramas Cerrar el socket Clases: java.net.datagramsocket java.net.datagrampacket Octubre 2007 Laboratorio de Redes de Comunicaciones 30

UDP Servidor (2) Creación del socket (java.net.datagramsocket) Constructores: DatagramSocket() DatagramSocket(int puerto) DatagramSocket(int puerto, InetAddress dirip) Métodos: void bind(socketaddress addr) Intercambio de datos Ídem cliente. Cierre del socket Ídem cliente. Octubre 2007 Laboratorio de Redes de Comunicaciones 31

Laboratorio de Redes de Comunicaciones Flujos de datos en Java Flujos de datos Ficheros

Flujos de datos: Introducción Los programas necesitan: Recoger información de una fuente externa. Enviar información a un destino externo. Esta información puede estar en: ficheros en disco, la red, memoria, programas, etc. Y puede ser de cualquier tipo: objetos, caracteres, imágenes, sonidos, etc. Octubre 2007 Laboratorio de Redes de Comunicaciones 33

Flujos de datos: Lectura El programa abre el flujo (stream) de datos en la fuente. El programa lee la información. Octubre 2007 Laboratorio de Redes de Comunicaciones 34

Flujos de datos: Escritura El programa abre un flujo (stream) de datos con el destino. Escribe la información. Octubre 2007 Laboratorio de Redes de Comunicaciones 35

Lectura Abrir el flujo de datos Mientras hay información Leer información Cerrar el flujo de datos Flujos de datos Escritura Abrir el flujo de datos Mientras hay información Escribir información Cerrar el flujo de datos Octubre 2007 Laboratorio de Redes de Comunicaciones 36

Flujos de datos: Clases Paquete java.io Existen 4 clases abstractas padre del resto de clases: Flujos de bytes java.io.outputstream, java.io.inputstream Flujos de caracteres java.io.reader, java.io.writer Normalmente son envoltorios sobre flujos de bytes. El flujo de bytes se utiliza para realizar la E/S física, y el flujo de caracteres realiza la conversión entre caracteres y bytes. La plataforma Java almacena los caracteres utilizando convenciones Unicode. Los flujos de caracteres traducen entre este formato interno y el juego de caracteres local. Octubre 2007 Laboratorio de Redes de Comunicaciones 37

Flujos de bytes. Lectura. Clase java.io.inputstream: Lee BYTES uno a uno o en un array. Métodos: int read() Lee un byte int read(byte buf[]) Lee un conjunto de bytes y los almacena en un array Devuelve el número de bytes leídos int read(byte buf[], int offset, int longitud) Lee un conjunto de bytes y los almacena en una porción de un array Devuelve el número de bytes leídos Devuelven 1 en caso de llegar al final del flujo de datos. void close() Cierra el flujo Octubre 2007 Laboratorio de Redes de Comunicaciones 38

Flujos de bytes. Escritura. Clase java.io.outputstream: Escribe BYTES uno a uno o a través un array. Métodos: void write (int c) Escribe un byte void write(byte buf[]) Escribe un array de bytes write(byte buf[], int offset, int longitud) Escribe una porción de un array de bytes void close() Cierra el flujo Octubre 2007 Laboratorio de Redes de Comunicaciones 39

Flujos de caracteres. Lectura. Clase java.io.reader: Lee CARACTERES uno a uno o en un array. Métodos: int read() Lee un carácter int read(char buf[]) Lee un conjunto de caracteres y los almacena en un array Devuelve el número de caracteres leídos int read(char buf[], int offset, int len) Lee un conjunto de caracteres y los almacena en una porción de un array Devuelve el número de caracteres leídos Devuelven 1 en caso de llegar al final del flujo de datos. void close() Cierra el flujo Octubre 2007 Laboratorio de Redes de Comunicaciones 40

Flujos de caracteres. Escritura. Clase java.io.writer: Escribe CARACTERES uno a uno o a través un array. Métodos: void write (int c) Escribe un carácter void write(char buf[]) Escribe un array de caracteres void write(char buf[], int offset, int longitud) Escribe una porción de un array de caracteres void close() Cierra el flujo Octubre 2007 Laboratorio de Redes de Comunicaciones 41

Flujos de datos orientados a líneas :Lectura Clase java.io.bufferedreader: Clase útil para la lectura de líneas de texto. Constructor: BufferedReader(Reader reader) Métodos: String readline() Lee una línea de texto. Devuelve la cadena leída o null si se alcanza el final del flujo. void close() Cierra el flujo Octubre 2007 Laboratorio de Redes de Comunicaciones 42

Flujos de datos orientados a líneas :Escritura Clase java.io.printwriter: Clase útil para escribir líneas de caracteres. Constructores: PrintWriter(OutputStream out) PrintWriter(OutputStream out, boolean autoflush) PrintWriter(Writer out) PrintWriter(Writer out, boolean autoflush) autoflush indica si ciertos métodos (incluido println) provocan un flush del buffer de escritura (por defecto false) Métodos: void println(string x) Escribe la cadena especificada más un fin de línea void flush() Escribe lo que haya en el buffer de escritura void close() Cierra el flujo Octubre 2007 Laboratorio de Redes de Comunicaciones 43

Conversión entre flujos de datos Clase java.io.inputstreamreader: Clase útil para la conversión de objetos InputStream a Reader. Hereda de Reader. Constructor: InputStreamReader(InputStream in) Clase java.io.outputstreamwriter: Clase útil para la conversión de objetos OutputStream a Writer. Hereda de Writer. Constructor: OutputStreamWriter(OutputStream out) Octubre 2007 Laboratorio de Redes de Comunicaciones 44

Ficheros Unidad de almacenamiento contenida en: discos, cintas, etc. Clase para manejo de ficheros y directorios: java.io.file Constructores: File(File parent,string child) File(String pathname) File(String parent,string child) Octubre 2007 Laboratorio de Redes de Comunicaciones 45

Clase java.io.file (1) Métodos String getname() Devuelve el nombre del fichero o directorio String getparent() Devuelve el path del directorio padre o null si no tiene. String getpath() Devuelve el path String getabsolutepath() Devuelve el path absoluto long lastmodified() Devuelve la hora de la última modificación. long length() Devuelve el tamaño. boolean canexecute() boolean canread() boolean canwrite() Indican si la aplicación puede ejecutar, leer y escribir en el fichero. Octubre 2007 Laboratorio de Redes de Comunicaciones 46

Clase java.io.file (2) Métodos boolean delete() Borra el fichero o directorio boolean renameto(file dest) Renombra el fichero o directorio boolean exists() Indica si existe un fichero o directorio con ese nombre boolean isdirectory() Indica si se trata de un directorio. boolean isfile() Indica si se trata de un fichero boolean createnewfile() Crea un fichero vacío con este nombre si no existía ya. boolean mkdir() Crea un directorio con este nombre boolean mkdirs() Crea un directorio con este nombre creando todos los directorios padre que sea necesario String[] list() Obtiene una lista de los ficheros y directorios contenidos en este directorio. Octubre 2007 Laboratorio de Redes de Comunicaciones 47

Ficheros. Flujos de bytes: Lectura Clase java.io.fileinputstream: Lee BYTES de un fichero. Acceso secuencial. Apertura de un FileInputStream: A través del constructor: FileInputStream(File file) File mifichero = new File("/etc/ejemplo"); FileInputStream fis = new FileInputStream(miFichero); FileInputStream(String name) FileInputStream fis = new FileInputStream("/etc/ejemplo"); Lectura y cierre: Mismos métodos que InputStream. Octubre 2007 Laboratorio de Redes de Comunicaciones 48

Ficheros. Flujos de bytes: Escritura Clase java.io.fileoutputstream: Escribe BYTES en un fichero. Apertura de un FileOutputStream: A través del constructor: FileOutputStream(File file) FileOutputStream(File file, boolean append) FileOutputStream(String name) FileOutputStream(String name, boolean append) append indica si lo que se escribe se añade al final del fichero Escritura y cierre: Mismos métodos que OutputStream. Octubre 2007 Laboratorio de Redes de Comunicaciones 49

Ficheros. Flujos de caracteres: Lectura Clase java.io.filereader: Lee CARACTERES de un fichero. Acceso secuencial. Apertura de un FileReader: A través del constructor: FileReader(File file) FileReader(String name) Lectura y cierre: Mismos métodos que Reader. Octubre 2007 Laboratorio de Redes de Comunicaciones 50

Ficheros. Flujos de caracteres: Escritura Clase java.io.filewriter: Escribe CARACTERES en un fichero. Apertura de un FileWriter: A través del constructor: FileWriter(File file) FileWriter(File file, boolean append) FileWriter(String name) FileWriter (String name, boolean append) append indica si lo que se escribe se añade al final del fichero Escritura y cierre: Mismos métodos que Writer. Octubre 2007 Laboratorio de Redes de Comunicaciones 51

Streams de E/S estándar Entrada estándar. Para leer datos introducidos por el usuario. System.in De tipo InputStream. Salida estándar y salida de error. Para mostrar información y mensajes de error al usuario. System.out, System.err De tipo PrintStream. Desciende de java.io.outputstream Tiene métodos para escribir caracteres (print, println) que aceptan parámetros de diferentes tipos (Object, String, char[], char, int, long, float, double, y boolean) Tiene métodos para escribir bytes: métodos write de OutputStream. Octubre 2007 Laboratorio de Redes de Comunicaciones 52

Laboratorio de Redes de Comunicaciones Programación Concurrente Threads

Programación Multithread La programación multihilo permite realizar muchas actividades simultáneas en un programa. Los hilos a veces llamados, procesos ligeros, o hilos de ejecución son ejecuciones concurrentes de un programa donde se comparten diversos recursos entre los distintos threads. Al estar estos hilos construidos en el mismo lenguaje, son más fáciles de usar que sus homólogos en C o C++. El beneficio de ser multihilo consiste en un mejor rendimiento interactivo y una mayor facilidad para modelar procesos concurrentes (como un servidor en Internet que debe atender a múltiples clientes de forma simultánea). Octubre 2007 Laboratorio de Redes de Comunicaciones 54

Threads: Introducción (I) Normalmente los programas están formados por un único hilo de ejecución y su comportamiento es secuencial, tienen: Un punto de inicio Una secuencia de ejecución Un final Cuando en un programa se quiere realizar más de una tarea simultáneamente se utilizan técnicas de ejecución concurrente, que permiten que diversos puntos del programa se estén ejecutando a la vez. Existen dos aproximaciones para ejecutar tareas de forma concurrente en un programa: Procesos. Threads. Octubre 2007 Laboratorio de Redes de Comunicaciones 55

Threads: Introducción (II) Threads vs Procesos Ambos son flujos secuenciales de control dentro de un programa. Todos los threads dentro de un proceso comparten recursos como la memoria. (Un objeto creado en un thread es visible desde otro). Los procesos no comparten recursos entre sí. (Un objeto creado en un proceso no es visible desde otro proceso distinto). Al compartir recursos, los threads se crean más rápido que los procesos y los cambios de contexto entre threads son más baratos. Esta ventaja de los threads varía mucho según el SO, siendo más grande en Windows (donde la creación de procesos es muy costosa). Como contrapartida, el mayor aislamiento que proporcionan los procesos hace más fácil evitar problemas que surgen de la ejecución concurrente sobre los mismos recursos. Ambas aproximaciones se pueden combinar en un mismo programa, que puede tener varios procesos, y cada uno de ellos con varios threads simultáneos. Octubre 2007 Laboratorio de Redes de Comunicaciones 56

Threads: Introducción (III) Un programa concurrente ejecuta múltiples threads simultáneamente, cada uno realizando diferentes tareas. Octubre 2007 Laboratorio de Redes de Comunicaciones 57

Threads: Introducción (IV) Java es multithread Permite la realización de programas de flujo múltiple: Programas que ejecutan simultáneamente múltiples tareas. Por ejemplo: Navegador que descarga páginas Web: un thread para la página HTML, otro para cada imagen, etc. Las aplicaciones Java básicas están formadas normalmente por un único proceso con un único thread, que invoca al método main de la clase que se ejecuta. Octubre 2007 Laboratorio de Redes de Comunicaciones 58

Threads: Introducción (V) Razones para utilizar multithreading Para lograr concurrencia en un programa (hacer varias cosas a la vez, cuando unas tareas no dependen de otras). Para eliminar los tiempos de espera a los usuarios de un programa Permiten hacer otro trabajo mientras el programa está bloqueado haciendo algo. Servir a varios clientes en paralelo, sin que tengan que esperar a que terminen otros para ser atendidos. Para aprovechar las capacidades multiproceso de las CPUs actuales (Multithreading, Multicore) y conseguir una mejora de la eficiencia. Ejemplos: Servidores que aceptan conexiones de múltiples clientes (Servidores Web, FTP, correo, ) Almacenar un archivo en disco. Mostrar una barra de progreso de una operación de una aplicación. Octubre 2007 Laboratorio de Redes de Comunicaciones 59

Threads: Java (I) Java para la creación de threads dispone de dos mecanismos: La clase java.lang.thread Se utiliza cuando se puede heredar directamente. La interfaz java.lang.runnable Se utiliza en los casos de que sea necesario la herencia múltiple (por ejemplo cuando una clase ya hereda de otra, como un Applet). NOTA: Método estático Thread.sleep(int milisegs): duerme un proceso o un thread durante el tiempo especificado. Octubre 2007 Laboratorio de Redes de Comunicaciones 60

Threads: Java (II) Método1: Para crear una clase que sea un thread (un hilo de ejecución independiente): Heredar de la clase Thread. Definir un constructor. Sobrescribir el método run(): public void run() El programa principal: Crea una instancia de la nueva clase: HijoThread t = new HijoThread(); Inicia la ejecución: t.start(); class HijoThread extends Thread { HijoThread() { // Inicialización } } public void run() { // Tarea a ejecutar en el thread... } Octubre 2007 Laboratorio de Redes de Comunicaciones 61

Threads: Java (III) Método 2: En caso de utilizar herencia múltiple: Declarar una clase que implemente la interfaz Runnable. Define un constructor. Sobrescribir el métod run(). public void run() El programa principal: Crea una instancia de la nueva clase: HijoRunnable runnable = new HijoRunnable(); Crea un thread pasándole como parámetro la nueva clase: Thread t = new Thread(runnable); Inicia la ejecución del thread: t.start(); class HijoRunnable implements Runnable{ HijoRunnable() { // Inicialización } } public void run() { // Tarea a ejecutar en el thread... } Octubre 2007 Laboratorio de Redes de Comunicaciones 62

Más información http://java.sun.com/docs/books/tutorial/ http://java.sun.com/docs/books/tutorial/reallybigindex.html Programación con Sockets http://java.sun.com/docs/books/tutorial/networking/sockets/index.html (Sockets) http://java.sun.com/docs/books/tutorial/networking/datagrams/index.html (Datagramas) Flujos de datos http://java.sun.com/docs/books/tutorial/essential/io/index.html http://java.sun.com/docs/books/tutorial/essential/io/streams.html (Streams) http://java.sun.com/docs/books/tutorial/essential/io/fileio.html (Files) Programación concurrente http://java.sun.com/docs/books/tutorial/essential/concurrency/threads.html (Threads) Octubre 2007 Laboratorio de Redes de Comunicaciones 63