i Threads en JAVA Sockets Lorena Alvarez Montiel – D

Slides:



Advertisements
Presentaciones similares
Java nos ofrece System.out para escribir en pantalla, pero también tenemos System.in para leer. System.in es un objeto de una clase de java que se llama.
Advertisements

CJ02 – Técnicas avanzadas en java 1.4 y 5.0
CJ02 – Técnicas avanzadas en java 1.4 y 5.0
Programación Interactiva Hilos
Programación Interactiva Aplicaciones Cliente-Servidor
“GUI para Conexiones y Transferencia de Datos Seguros”
Sockets y Threads en JAVA
Servidor de Batalla Naval.
Qué pasa cuando varios clientes tratan de conectarse al mismo teimpo a un servidor Una forma es ir atendiéndolos de a uno en un ciclo: como en el programa.
El Socket Un socket es un extremo de un link de comunicación entre dos programas que corren en una red. El socket esta asociado (amarrado, bound) a ub.
Tema 12: Programación multihilo
 son segmentos de código de un programa que se ejecutan secuencialmente de modo independiente de las otras partes del programa.
CONCEPTES AVANÇATS DE SISTEMES OPERATIUS Departament d’Arquitectura de Computadors (Seminaris de CASO) Autors Christophe Fontano Julien Alagnou Socket.
Área de Ingeniería Telemática 1 Universidad de Sevilla Fundamentos de Telemática Tema 16: Comunicaciones en Red.
Sistemas Operativos Distribuidos Prácticas Justo N. Hidalgo Sanz Universidad Antonio de Nebrija 2002/03.
1 Streams en Java Agustín J. González ELO Generalidades Un Stream es simplemente una fuente o destino de bytes. Los streams más comunes son los.
Sockets en Java. Sockets ● Para programar aplicaciones en red en Java se utilizan los Sockets. ● Un socket permite establecer y manejar una conexión entre.
CONCEPTES AVANÇATS DE SISTEMES OPERATIUS Departament d’Arquitectura de Computadors (Seminaris de CASO) Autors Sincronización de Threads en Java Josep Joan.
Capítulo 5 - b: Hilos. 4.2 Silberschatz, Galvin and Gagne ©2005 Operating System Concepts – 7 th edition, Jan 23, 2005 Ejemplo de hilos: un applet Un.
Cliente/Servidor ● Normalmente queremos algo más que conectarnos a un servidor ● El servidor nos va a dar un servicio ● Protocolo – Orden y tipo de datos.
Ejemplo UDP en Java NOTAS import java.net.*; import java.io.*;
Aplicaciones Cliente/Servidor con Java. Acceso a la red TCP UDP HTTP, Telnet, FTP, SMTP, SNMP, etc (Aplicaciones usuario) IP TCP/IP ● TCP: Transmission.
Sockets. / Los sockets (zócalos, referido a los enchufes de conexión de cables) son mecanismos de comunicación entre programas a través de una red TCP/IP.
Universidad de Chile - Tupper 2007, Santiago - Fono/Fax: (56 2) cec.uchile.cl Módulo ECI - 11: Fundamentos de Redes de Computadores.
Programando Clientes TCP Postítulo La Clase InetAddress Una dirección IP es la dirección absoluta de un computador cualquiera en toda la internet.
INFORMATICA III ESCUELA DE INGENIERIA ELECTRONICA DEPARTAMENTO DE SISTEMAS E INFORMATICA.
2: Capa Aplicación 1 Capítulo 2: Capa Aplicación  2.1 Principios de la aplicaciones de red  2.2 Web y HTTP  2.3 FTP  2.4 Correo Electrónico  SMTP,
COMPARATIVA CLIENT/SERVIDOR AMB SOCKETS C vs. JAVA MANEL DOMÍNGUEZ SERRA GERARD ROCA MALLOFRÉ.
TEMA 2. Programación Concurrente
User Datagram Protocol UDP Juan Pablo Araneda Danilo Araya Z.
Universidad de Chile - Tupper 2007, Santiago - Fono/Fax: (56 2) cec.uchile.cl Módulo ECI - 11: Fundamentos de Redes de Computadores.
Universidad de Chile - Tupper 2007, Santiago - Fono/Fax: (56 2) cec.uchile.cl Módulo ECI - 11: Fundamentos de Redes de Computadores.
CONCEPTES AVANÇATS DE SISTEMES OPERATIUS Departament d’Arquitectura de Computadors (Seminaris de CASO) Autors MULTITHREADING & JAVA SYNCHRONIZATION David.
Universidad de Chile - Tupper 2007, Santiago - Fono/Fax: (56 2) cec.uchile.cl Módulo ECI - 11: Fundamentos de Redes de Computadores.
2: Capa Aplicación 1 Capa Aplicación: Programación de sockets ELO322: Redes de Computadores Agustín J. González Este material está basado en:  Material.
Andres Marín L. Programación sockets en java.
Hilos y Multihilos Un thread (hilo, flujo de control del programa) representa un proceso individual ejecutándose en un sistema. A veces se les llama.
Tema 1: Concurrencia con Java
1 Introducción a las Comunicaciones en Red. import java.net.InetAddress; import java.net.UnknownHostException; public class PruebaSockets { public static.
TFG – Àrea Enginyeria del programari
INTEGRANTES: JORGE CRUZ DE OCAMPO EDSON SANCHEZ SUAREZ
Serialització i persistència
Capa Aplicación: Programación de sockets
DOCENTE: EMILIO ISMAEL BUSTAMANTE MONTES
L'ELECTRICITAT I CIRCUIT ELÈCTRIC.
La Placa Base Izan Sánchez 4º C.
Symbian: un sistema operatiu per mòbils
Campus Virtual.
TEMA3: Gestió de correu i agenda electrònica
L’ordinador i els Sistemes Operatius(S.O)
1 u n i t a t Sistemes informàtics. Treball en xarxa.
Tema 2. DIVISIBILITAT.
Generacions de llocs web
Un exemple de Màquina Virtual: el programa VMware
TERMOREGULACIÓ HORÀRIA INDIVIDUAL DELS ESPAIS DEL CENTRE
Disseny de la persistència Serialització
Jonathan Ceballos Rodriguez ( ) Zenón Perisé Alía ( )
Seguretat a internet: Cavalls de Troia
Disseny de la persistència Serialització
LES XARXES LOCALS i els seus components.
TEMA 2 XARXES LOCALS David Bermúdez 4tC Vanesa Elvira 4tB
XARXES PRIVADES VIRTUALS ( VPNs )
BEGINNER EV3 PROGRAMMING Lesson
Sistemes Operatius (S.O.) Onion: Mecanisme d'entrada al sistema
Multithreading i sincronització Edgar Ros Ferrer Xavier Farré Barbera
Threads en Java David Gañán Jiménez.
Xavi Fabregat 4tA Karim Atsailali 4tA
Objetos con linea de ejecucion propia
Programación Orientada a Objetos
Optimització d’E/S per aplicacions paral·leles
Transcripción de la presentación:

i Threads en JAVA Sockets Lorena Alvarez Montiel – D8854711 Jordi Brínquez Jiménez – E6334930 Jonathan Lafuente Castillo – D8105261 en JAVA

Sockets i threads en JAVA Classe InetAddress. Classe Socket. Classe ServerSocket. Classe DatagramSocket. Threads: Què són els Threads i per què serveixen. Classe Thread Classe ThreadGroup. Sockets i Threads en JAVA: Un exemple.

InetAddress : Aquesta classe conté les funcions que s’utilitzen per resoldre noms en @ IP i viceversa. Operacions byte[] getAddress ()           Retorna l'adreça IP d'aquest objecte. static InetAddress getByName (String host)           Determina (resol) l'adreça IP del host especificat. String getHostAddress ()           Retorna l'adreça IP amb la forma xxx.xxx.xxx.xxx String getHostName ()           Retorna el nom del host per aquesta adreça IP. static InetAddress getLocalHost ()           Retorna el nom del host local. String toString ()           Converteix l'adreça IP en una cadena.

Socket : Un socket és un punt final de comunicació. Les aplicacions client/servidor fan servir aquests mecanisme per comunicar-se entre ells. Depenent del tipus de connexió es farà servir : Orientat a connexió : La classe Socket (per al client) i ServerSocket (per al servidor). Orientat a no-connexió : La classe DatagramSocket (tant pel client com pel servidor).

Socket : Operacions constructores Socket () Crea un socket sense connectar. Socket (InetAddress address, int port)           Crea un socket i el connecta a l'adreça address i al port port. Socket (String host, int port)           Crea un socket i el connecta al host host i al port port. Socket (InetAddress address, int port, InetAddress localAddr, int localPort)           Crea un socket i el connecta a l'adreça i port remots (address, port) amb l'adreça i port locals localAddr, localPort). Socket (String host, int port, InetAddress localAddr, int localPort)           Idem que l'anterior pero el host ve donat com un String.

Socket : Mètodes de informació del socket InetAddress getInetAddress ()           Retorna l'adreça a la que el socket esta connectat. InetAddress getLocalAddress ()           Recupera l'adreça local on el socket està connectat. int getLocalPort ()           Retorna el port locat on el socket està connectat. int getPort ()           Retorna el port remot on el socket està connectat. String toString ()           Converteix aquest en una cadena que el representa.

Socket : Mètodes de comunicació Mètodes d'opcions del socket void close ()           Tanca el socket. InputStream getInputStream ()           Retorna un input stream per aquest socket. OutputStream getOutputStream ()           Retorna un output stream per aquest socket. Mètodes d'opcions del socket int getSoTimeout ()           Retorna la configuració del timeout. void setSoTimeout (int timeout)           Activa/desactiva el timeout d'aquest socket. El temps està en milisegons.

ServerSocket : Constructores Mètodes de comunicació ServerSocket (int port)           Crea un server socket en el port especificat. ServerSocket (int port, int backlog)           Crea un server socket en el port especificat, fa el bind i accepta fins a backlog clients. ServerSocket (int port, int backlog, InetAddress bindAddr)           Crea un server socket en el port especificat, fa el bind a l'adreça bindAddr i accepta fins a backlog clients. Mètodes de comunicació Socket accept ()           Escolta el socket esperant connexions i les acepta. void close ()           Tanca el socket.

ServerSocket : Mètodes de informació del socket InetAddress getInetAddress ()           Retorna l'adreça del server socket. int getLocalPort ()           Retorna el port en el que el socket està escoltant. int getSoTimeout ()           Retorna la configuració del timeout. void setSoTimeout (int timeout) Activa/desactiva el timeout d'aquest socket. El temps està en milisegons. String toString ()           Converteix aquest en una cadena que el representa.

DatagramSocket : Constructores Mètodes de comunicació           Crea un datagram socket i fa un bind a qualsevol port disponible en la màquina local. DatagramSocket (int port)           Crea un datagram socket i fa un bind al port especificat de la màquina local. DatagramSocket (int port, InetAddress laddr)           Crea un datagram socket, associat a l'adreça local especificada.   Mètodes de comunicació void close ()           Tanca el datagram socket. void connect (InetAddress address, int port)           Connecta el socket a l'adreça remota. void disconnect ()           Tanca el socket. void receive (DatagramPacket p)           Reb un paquet de datagram des del socket. void send (DatagramPacket p)           Envia un paquet de datagram pel socket.

DatagramSocket : Mètodes de informació del socket InetAddress getInetAddress ()           Retorna l'adreça a la qual el socket està connectat. InetAddress getLocalAddress ()           Retorna l'adreça local a la qual el socket està associat. int getLocalPort ()           Retorna el port d'on escolta el socket. int getPort ()           Retorna el port del socket. int getSoTimeout ()           Retorna la configuració del timeout. void setSoTimeout (int timeout) Activa/desactiva el timeout d'aquest socket. El temps està en milisegons.

Què són els Threads i per què serveixen. Un thread és un flux d’execució d’un programa, és a dir unes instruccións que s’executen de forma continuada, un PC i un SP. Els threads es fan servir per aprofitar el paral·lelísme i la concurrència que els ordinadors multiprocessador poden oferir, així com també facilitar la programació (per exemple, el FTP fet al laboratori). El gran aventatge que tenen respecte dels processos és que permeten canvis de context (de thread) de forma menys costosa que si fossin diferents processos.

Thread : Operacions constructores Thread () Thread (Runnable target) Crea un nou objecte de tipus Thread . Thread (Runnable target) Crea un nou objecte target de tipus Thread. Thread (Runnable target, String name) Crea un nou objecte target de tipus Thread amb nom name. Thread (String name) Crea un nou objecte de tipus Thread de nom name. Thread (ThreadGroup group, Runnable target) Crea un nou objecte target de tipus Thread dins d'un ThreadGroup anomenat group. Thread (ThreadGroup group, Runnable target, String name) Crea un nou objecte target de tipus Thread amb nom name dins d'un ThreadGroup anomenat group. Thread (ThreadGroup group, String name) Crea un nou objecte de tipus Thread amb nom name dins d'un ThreadGroup anomenat group.

Thread : Mètodes relacionats amb les propietats Valors de la prioritat String getName () Retorna el nom del thread. int getPriority () Retorna la prioritat del thread. ThreadGroup getThreadGroup () Retorna el grup de threads al qual pertany. void setName (String name) Cambia el nom del thread. void setPriority (int newPriority) Cambia la prioritat del thread. Valors de la prioritat static int MAX_PRIORITY static int MIN_PRIORITY static int NORM_PRIORITY

Thread : Mètodes relacionats amb l'estat void destroy () Destrueix el thread, sense alliberar memòria. boolean isAlive () Comproba que el thread estigui viu. void join () Espera fins que el thread mor. void join (long millis) Espera com a molt millis milisegons fins que el thread mor. void join (long millis, int nanos) Espera com a molt millis milisegons i nanos nanosegons fins que el thread mor. void run () Comença l'execució d'un thread. static void sleep (long millis) Adorm el thread durant millis milisegons. static void sleep (long millis, int nanos) Adorm el thread durant millis milisegons i nanos nanosegons. void start () Engega l'execució del thread. static void yield () Para l'execució del thread actual i permet a altres threads la seva execució.

Thread : Mètodes relacionats amb les interrupcions void interrupt () Interrumpeix el thread. static boolean interrupted () Comproba si el trheat ha estat instarromput i borra el contingut de la variable d'estat. boolean isInterrupted () Comproba si el trheat ha estat instarromput. Mètodes relacionats amb el thread actual static int activeCount () Retorna el nombre de threads actius en aquests grup de threads. static Thread currentThread () Returna una referència al thread que s'està executant. static int enumerate (Thread[] tarray) Copia al vector tarray els threads actius en del seu grup i dels subgrups que el componen. Mètode descriptor String toString () Retorna una cadena que representa al thread, aquesta inclou el nom, la prioritat i el grup.

ThreadGroup : Operacions constructores ThreadGroup (String name) Construeix un nou grup de threads de nom name. ThreadGroup (ThreadGroup parent, String name) Construeix un nou grup de threads de nom name dintre del grup parent. Mètodes relacionats amb les propietats int getMaxPriority () Retorna la màxima prioritat del grup de threads. String getName () Retorna el nom del grup de threads. ThreadGroup getParent () Returns el grup pare d'aquest grup. void setMaxPriority (int pri) Cambia la prioritat dels elements del grup a la màxima possible.

ThreadGroup : Mètodes relacionats amb l'estat del grup int activeCount () Retorna una estimació del nombre de threads actius en aquest grup. int activeGroupCount () Retorna una estimació del nombre de grups actius en aquest grup. int enumerate (Thread[] list) Copia a la llista els threads actius d'aquest grup i dels seus subgrups. int enumerate (Thread[] list, boolean recurse) Copia a la llista els threads actius d'aquest grup i en cas que recurse valgui cert també dels seus subgrups. int enumerate (ThreadGroup[] list) Copia a la llista els subgrups actius d'aquest grup. int enumerate (ThreadGroup[] list, boolean recurse) Copia a la llista els subgrups actius d'aquest grup i en cas que recurse valgui cert també dels boolean isDestroyed () comproba si el grup de threads ha estat destuït. void list () Llista per pantalla informació sobre el grup.

ThreadGroup : Mètodes relacionats amb l'estat d'un grup de threads void destroy () Destrueix el grup i tots els seus subgrups. Mètodes relacionats amb la seguretat void checkAccess () Comproba si el thread en execució té permís per modificar aquest grup de threads. Mètodes relacionats amb les interrupcions void interrupt () Interromp tots els threads en aquest grup. Mètode descriptor String toString () Retorna una cadena que representa al grup de threads.

Sockets i Threads en JAVA Seminari de CASO: Sockets i Threads en JAVA Exemple d’ús

Explicació de l’exemple Tenim diversos processos que accedeixen a un vector circular concurrentment: uns processos llegint del vector i els altres escrivint-hi. Quan es creen aquests processos, es connecten amb un servidor (de lectura o escriptura) que crea un thread i un socket per atendre'ls.

Explicació de l’exemple Vector circular Servidor d'escriptors Servidor de lectors Thread de lector Thread d'escriptor Lector Escriptor

Codi de l’escriptor public class Emisor{ public static void main(String[] args)throws IOException{ OutputStream skout; DataOutputStream dos; Socket sk = null; sk = new Socket("127.0.0.1",5502);//petició al servidor d’escriptors try{ skout = sk.getOutputStream(); dos = new DataOutputStream(skout); String missat = LlegirTeclat.LlegirLinea(); //Llegeixo de teclat while (missat.length() > 1){ dos.writeUTF(missat); missat = LlegirTeclat.LlegirLinea();} dos.close(); skout.close(); sk.close();} catch (IOException e){}}}

Codi del thread d’escriptor (I) public class EscriuPar extends Thread{ private CuaString cua; //vector compartit per tots els processos private Socket sk; //socket per comunicar-se amb l’escriptor que atén public EscriuPar(CuaString h, Socket soc) {//constructora del thread cua = h; sk = soc;} public void run() {//mètode que s’executa en fer start InputStream skin; DataInputStream dis; try{ skin = sk.getInputStream(); dis = new DataInputStream(skin); String st = new String (dis.readUTF()); //lectura del socket try{ cua.SetString(st);} //escriptura al vector catch(InterruptedException e){}

Codi del thread d’escriptor (II) while (st.length() > 0){//adormim el proces try{ sleep((int)(Math.random()*3000));} catch(InterruptedException e){} st = dis.readUTF(); try{cua.SetString(st);} catch(InterruptedException e){}} dis.close();//tanquem els canals skin.close(); sk.close();} catch(IOException e){}}}

Codi del lector public class Receptor{ public static void main(String[] args)throws IOException{ Socket sk = null; InputStream skin; DataInputStream dis; sk = new Socket("127.0.0.1", 5503);//petició al servidor de lectors. skin = sk.getInputStream(); dis = new DataInputStream(skin);//tenim una sortida de dades String st = new String (dis.readUTF()); //comencem a llegir System.out.println(st); // i a escriure per pantalla while (st.length() > 0){ st = dis.readUTF(); System.out.println(st);} dis.close(); //tanquem els canals oberts. skin.close(); sk.close();}}

Codi del thread de lector (I) class LlegeixPar extends Thread{ private CuaString cua;//vector compartit per tots els processos private Socket sk;//socket per atendre el seu clien public LlegeixPar(CuaString h, Socket s){ //constructora cua = h; //valor inicial sk = s;} public void run(){ OutputStream skout; DataOutputStream dos; try { skout = sk.getOutputStream(); dos = new DataOutputStream(skout);//tenim una entrada de dades String missat=""; try{missat = cua.GetString();}//llegim del vector catch(InterruptedException e){}

Codi del thread de lector (II) while (missat.length() > 1){ dos.writeUTF(missat); //escrivim al socket try{sleep((int)(Math.random()*3000));} //adormim el procés catch (InterruptedException e){} try{missat = cua.GetString(); } catch(InterruptedException e){}} dos.writeUTF(missat); dos.close(); skout.close(); sk.close();} catch (IOException e){}}}

Codi del servidor public class Servidors { public static void main (String[] args) CuaString cua = new CuaString(5); //creem el vector a compartir ServEscrip serE = new ServEscrip(cua); //creem el servidor escriptors serE.start(); //el posem en funcionament ServLec serL = new ServLec(cua); //creem el servidor de lectors serL.start(); //el posem en funcionament } Els servidors de lectors i escriptors són dos threads perquè comparteixin el mateix vector.

Codi del servidor d’escriptors class ServEscrip extends Thread{ private CuaString cua; //vector compartit per tots els processos. static int maxim = 2; //màxim de clients que acceptarem. public ServEscrip(CuaString c){//constructora cua = c;} public void run (){ ServerSocket ss = null; Socket sk = null; int i = 0; try{ ss = new ServerSocket(5502); //creem el ServerSocket per acceptar while (i < maxim){ // peticions dels clients sk = ss.accept(); //acceptem el client EscriuPar esc = new EscriuPar(cua, sk); //creem el thead per esc.start(); // atendre’l i el posem en funcionament. i++;}} catch (IOException e){}}}

Codi del servidor de lectors class ServLec extends Thread{ private CuaString cua;//vector compartit per tots static int maxim = 2; // màxim de client per atendre public ServLec(CuaString c){ //constructora cua = c;} public void run (){ ServerSocket ss = null; Socket sk = null; int i = 0; try{ ss = new ServerSocket(5503); //Creem el ServerSocket per atendre while (i < maxim){ // les peticions dels lectors sk = ss.accept(); //acceptem la petició LlegeixPar lec = new LlegeixPar(cua, sk);//creem el thread per lec.start(); //atendre’l i el posem en funcionament. i++;}} catch (IOException e){}}}

Codi del vector (I) class CuaString { private String[] cua; //cua de cadenes de caràcters; private int p_llegit = 0; //apuntador al següent element a llegir; private int p_escrit = 0; //apuntador al primer buit de la cua; private int buits, plens; //nombre de pos. buides i ocupades de la cua; public CuaString(int n) //constructora if (n < 1) n = 10; cua = new String[n]; buits = cua.length; plens = 0; }

Codi del vector (II) public synchronized String GetString() throws InterruptedException { while (plens == 0) try wait(); //Adormim el consumidor } catch(InterruptedException e){} plens--; buits++; System.out.println("LECTOR: Llocs buits: " + buits + ", llocs plens: " + plens); String valor = cua[p_llegit]; p_llegit = (p_llegit + 1) % cua.length; notifyAll(); return valor;

Codi del vector (III) public synchronized void SetString(String val)throws InterruptedException { while (buits == 0) try wait(); } catch(InterruptedException e){} buits--; plens++; System.out.println("ESCRIPTOR: Llocs buits: " + buits + ", llocs plens: " + plens); cua[p_escrit] = val; p_escrit = (p_escrit + 1) % cua.length; notifyAll(); //despertem tots els processos adormits per a que comprovin si poden continuar.}}

Bibliografia The Java™ Class Libraries -- Second Edition – Volume 1 Patrick Chan, Rosanna Lee, Douglas Kramer Java 1.2 al descubierto Jamie Jaworski, Ed. Prentice Hall Java 2 -- Curso de programación Francisco Javier Ceballos, Ed. Rama http://java.sun.com http://www.cybercursos.net (Java desde cero)