Documentos de Académico
Documentos de Profesional
Documentos de Cultura
Seminario Java
Seminario Java
Socketsorientadosaconexin Socketsnoorientadosaconexin
UNIVERSIDADEDACORUA
Java:Distribuido
UNIVERSIDADEDACORUA
Javasehaconstruidoconextensascapacidadesde interconexinTCP/IP.Existenlibrerasderutinaspara accedereinteractuarconprotocoloscomohttpyftp.Esto permitealosprogramadoresaccederalainformacina travsdelaredcontantafacilidadcomoalosficheros locales. Javaensnoesdistribuido,sinoqueproporcionalas librerasyherramientasparaquelosprogramaspuedanser distribuidos,esdecir,quesecorranenvariasmquinas, interactuando.
Octubre2007
LaboratoriodeRedesdeComunicaciones
Java:Distribuido
Pensadoparasuaplicacinenredes. Soportavariosnivelesdeconectividadenred:
PermiteabrirunURL RMI Permitetrabajarconsockets
UNIVERSIDADEDACORUA
Permitecreardeformasencilla,tantoaplicacionescliente comoservidor.
Octubre2007
LaboratoriodeRedesdeComunicaciones
Clientesyservidores
AplicacionesCliente/Servidor Cliente:
Programaqueejecutaelusuario Solicitaunservicioaunamquina
UNIVERSIDADEDACORUA
Servidor:
Ofreceunservicioamltiplesclientes
Ejemplos:telnet,ftp,web,echo
Octubre2007
LaboratoriodeRedesdeComunicaciones
Ejemplo:Serviciodetelnet
UNIVERSIDADEDACORUA
Ejecutauntelnet
Servidordetelnet:telnetd
Octubre2007
LaboratoriodeRedesdeComunicaciones
Conceptosbsicosderedes
EnInternetseutilizalapilade protocolosTCP/IPparael establecimientoyrealizacinde conexiones,basadoenun conjuntodeprotocolos organizadosendiferentes niveles:Enlace/Red/ Transporte/Aplicacin. Normalmente,cuandose escribenaplicacionesJavaen Redseprogramaanivelde aplicacin. Esposiblerealizarprogramasa msbajonivelutilizandola APIjava.net=>nivelde transporte=>TCP/UDP.
UNIVERSIDADEDACORUA
Octubre2007
LaboratoriodeRedesdeComunicaciones
CapadeTransporte:TCPvsUDP
TCP:TransmissionControlProtocol
Protocoloorientadoaconexin Proveeunflujodebytesfiableentredosordenadores.
Llegadaenorden,correcta,sinperdernada.
UNIVERSIDADEDACORUA
ProtocolosdelniveldeaplicacinqueusanTCP:telnet,http,ftp.
UDP:UserDatagramProtocol
Noorientadoaconexin. Envapaquetesdedatos(datagramas)independientessin garantas. ProtocolosdelniveldeaplicacinqueusanUDP:tftp,ping. Permitebroadcast.
Octubre2007 LaboratoriodeRedesdeComunicaciones 7
Quesunpuerto?
UNIVERSIDADEDACORUA
Puertos:
IndependientesparaTCPyUDP. 16bitsRango:0a65535. Reservados:0a1023(wellknownports)
Paraserviciosconocidos:HTTP,FTP, Nodeberanserutilizadosporaplicacionesdeusuario.
Octubre2007
LaboratoriodeRedesdeComunicaciones
TCP
UNIVERSIDADEDACORUA
Unaaplicacinservidoraseregistraenunpuertoconcreto.
Elservidorseregistraenelsistemapararecibirlosdatosdirigidos aesepuerto.
Elclienteseconectaconelservidorusandoesenmerode puerto.
Sloenelestablecimientodelaconexinseprecisala IP+puerto. ElrestodepaquetesTCPslollevanunidentificadordela conexin.
Servidor
p u e r t o
TCP
Cliente
Octubre2007
LaboratoriodeRedesdeComunicaciones
UDP
UNIVERSIDADEDACORUA
Unaaplicacinservidoraseregistraenunpuertoconcreto.
Elservidorseregistraenelsistemapararecibirlosdatosdirigidos aesepuerto.
Elclienteenvadatagramasquecontienenelnmerode puertodeldestinoasociadoalaaplicacinservidora.
UDPenrutahacialaaplicacinadecuada. EncadapaqueteUDPvatodalainformacinnecesariaparaque enrute:IP+puerto
Aplicacin Puerto Aplicacin Puerto UDP #Puerto
Octubre2007
Aplicacin Puerto
Datos
Paquete
10
LaboratoriodeRedesdeComunicaciones
ClasesparaRedesenJDK
Paquetejava.net
UNIVERSIDADEDACORUA
ClasesDatagramPacket,DatagramSocket,MulticastSocket
UtilizanUDPparacomunicacionesdered.
Nivelesdecomunicacindered
Bajonivel:Aplicacionescliente/servidorbasadasenprotocolos. Altonivel:Accesoarecursosdered
Octubre2007
LaboratoriodeRedesdeComunicaciones
11
Quesunsocket?
UNIVERSIDADEDACORUA
Esunextremodeunenlacedecomunicacinbidireccional entredosprogramasquesecomunicanporlared.
Unsocketseasociaaunnmerodepuerto.
Octubre2007
LaboratoriodeRedesdeComunicaciones
12
SocketsTCP(1)
Socketsorientadosaconexin. Elservidorseejecutaenunamquinaycreaunsocket orientadoaconexinligadoaunnmerodepuerto especfico.
UNIVERSIDADEDACORUA
Elservidorespera,escuchandoporesesocket,aquelosclientes haganpeticionesdeconexin.
Elclienteconoce:
Lamquinadondeseestejecutandoelservidor Elpuertodondeelservidorestescuchando.
p u e r Servidor t o
Octubre2007
l i s t e n
Peticinde conexin
p u e r t o
Cliente
LaboratoriodeRedesdeComunicaciones
13
SocketsTCP(2)
UNIVERSIDADEDACORUA
Sitodovabienelservidoraceptalaconexin.
Elservidorobtieneunnuevosocketasociadoalmismopuerto localqueeloriginal,yquetienecomootroextremodelaconexin ladireccinypuertodelcliente. Esnecesariocrearunnuevosocketparaatenderalcliente,para poderseguirrecibiendopeticionesdeconexinatravsdelsocket original.
Octubre2007 LaboratoriodeRedesdeComunicaciones 14
SocketsTCP(3)
UNIVERSIDADEDACORUA
Conexin
Cliente
Clases:
java.net.Socket:Implementaunextremodeunaconexinbidireccional. java.net.ServerSocket:Implementaunsocketquelosservidorespueden utilizarparaescucharyaceptarpeticionesdeclientes.
Octubre2007
LaboratoriodeRedesdeComunicaciones
15
SocketsUDP(1)
SocketsNOorientadosaconexin.
Seenvanyrecibenpaquetesindependientesdeinformacin ClientesyservidoresNOseconectan NOsegarantizalarecepcindelpaquetenielorden.
UNIVERSIDADEDACORUA
Datagrama:
Mensajeindependiente,enviadoatravsdeunaredcuyallegada,tiempo dellegadaycontenidonoestgarantizado.
Elservidorseejecutaenunamquinaycreaunsocketnoorientadoa conexinqueestligadoaunnmerodepuertoespecfico.
Apartirdeahelservidorrecibetodoslosdatosenviadosaesepuerto UDP,leyendoatravsdeesesocket.
Elclienteconoce:
Lamquinadondeseestejecutandoelservidor Elpuertoasociadoalservidor.
Octubre2007
LaboratoriodeRedesdeComunicaciones
16
SocketsUDP(2)
UNIVERSIDADEDACORUA
Elclientecreaunsocketnoorientadoaconexinligadoaunnmero depuertoespecficoyloutilizaparaenviarDatagramasalservidor.
Normalmentelaasignacindelnmerodepuertoenelclientelahaceel sistema. LosDatagramasenviadosdebencontenerladireccinynmerodepuerto delservidoralquevandirigidos.
CuandounservidorrecibeunDatagrama:
Obtieneladireccindelamquinadelclienteysunmerodepuerto. EnvalarespuestaalclientecreandounDatagramadirigidoaesamquina ypuerto.
Clases:
java.net.DatagramSocket java.net.DatagramPacket
Octubre2007
LaboratoriodeRedesdeComunicaciones
17
DireccionesIP
Clasejava.net.InetAddress:
Mtodosestticos:
InetAddressgetByName(Stringhost)
ObtieneladireccinIPdelamquina RecibeelnombredelamquinaosudireccinIPcomocadena.
UNIVERSIDADEDACORUA
InetAddress[]getAllByName(Stringhost)
OtienetodaslasdireccionesIPdeunamquina. RecibeelnombredelamquinaosudireccinIPcomocadena.
InetAddressgetLocalHost():
ObtieneladireccinIPdelamquinaenlaqueseestejecutando.
Mtodo:
publicStringgetHostName()
DevuelveelnombredelamquinacorrespondienteaestaIP.
Octubre2007
LaboratoriodeRedesdeComunicaciones
18
TCPCliente(1)
Operacin:
Crearunsocket Establecerlaconexinconelservidor Intercambiodedatos(segnprotocolo):
Abrirunflujodeentradayotrodesalida Escribiryleerdelosflujos
UNIVERSIDADEDACORUA
Cerrarlosflujos Cerrarelsocket
Clase:java.net.Socket
Octubre2007
LaboratoriodeRedesdeComunicaciones
19
TCPCliente(2)
Creacinyconexindelsocket(java.net.Socket).
UNIVERSIDADEDACORUA
Mtodos
voidbind(SocketAddressbindpoint) voidconnect(SocketAddressendpoint) voidconnect(SocketAddressendpoint,inttimeout)
Octubre2007 LaboratoriodeRedesdeComunicaciones 20
TCPCliente(3)
Abrirflujosdedatosdelsocket:
Mtodos:
InputStreamgetInputStream() OutputStreamgetOutputStream()
UNIVERSIDADEDACORUA
Recomendacin(sisetransmiteTEXTO):
Paralaentradadedatos:BufferedReaderInputStreamReader
MtodoreadLine().
Paralasalidadedatos:PrintWriter
Mtodoprintln().
Octubre2007
LaboratoriodeRedesdeComunicaciones
21
TCPCliente(4)
Cierredelosflujosdelecturayescritura:
Mtodo:
voidclose()
UNIVERSIDADEDACORUA
Cierredelsocket:
Mtodo:
voidclose()
Octubre2007
LaboratoriodeRedesdeComunicaciones
22
TCPServidor(1)
Operacin:
Crearunsocketservidor Mientras(durelaejecucindelservidor)
Esperarconexindeuncliente.
Crearunsocketconectadoalcliente. Intercambiodedatos(segnprotocolo).Enotrohilodeejecucin? Abrirunflujodeentradayotrodesalida Leeryescribirdelosflujos Cerrarlosflujos Cerrarelsocket
UNIVERSIDADEDACORUA
Cerrarelsocketservidor
Clases:
java.net.ServerSocket java.net.Socket
Octubre2007 LaboratoriodeRedesdeComunicaciones 23
TCPServidor(2)
Creacindelsocketservidor(java.net.ServerSocket)
UNIVERSIDADEDACORUA
ServerSocket(intpuerto,intbacklog,InetAddressdirIP)
dirIp:Direccinporlaquevaaaceptarconexiones(encasodequela mquinadelservidortengamsdeuna).
Mtodos:
voidbind(SocketAddressendpoint) voidbind(SocketAddressendpoint,intbacklog)
Octubre2007 LaboratoriodeRedesdeComunicaciones 24
TCPServidor(3)
Esperaryaceptarconexiones:
Mtodo:
Socketaccept()
DevuelveunSocketconectadoalclientequerealizlaconexin.
UNIVERSIDADEDACORUA
Abrirunflujodeentradayotrodesalida
demcliente.
Leeryescribirenlosflujos
demcliente.
Octubre2007
LaboratoriodeRedesdeComunicaciones
25
TCPServidor(4)
Cerrarlosflujos
demcliente.
UNIVERSIDADEDACORUA
Cerrarelsocket
demcliente.
Cerrarelsocketservidor.
Mtodo:
voidclose()
Octubre2007
LaboratoriodeRedesdeComunicaciones
26
UDPCliente(1)
Operacin:
Crearunsocketnoorientadoaconexin. Intercambiodedatos(segnprotocolo):
EnviaryrecibirDatagramas
UNIVERSIDADEDACORUA
Cerrarelsocket
Clases:
java.net.DatagramSocket java.net.DatagramPacket
Octubre2007
LaboratoriodeRedesdeComunicaciones
27
UDPCliente(2)
Creacindelsocket(java.net.DatagramSocket)
Constructores:
DatagramSocket()
Normalmenteseutilizaesteenlosclientes
UNIVERSIDADEDACORUA
DatagramSocket(intpuerto) DatagramSocket(intpuerto,InetAddressdirIP)
Intercambiodedatos
Enviar:
voidsend(DatagramPacket)
Recibir:
voidreceive(DatagramPacket)
Establecertimeoutpararecibir.
setSoTimeout(intmilisegundos)
Cierredelsocket:
Mtodo:
voidclose()
Octubre2007
LaboratoriodeRedesdeComunicaciones
28
UDPCliente(3)
Datagramas(java.net.DatagramPacket):
Constructores(paraenviar):
UNIVERSIDADEDACORUA
Constructores(pararecibir):
DatagramPacket(byte[]buf,intlength) DatagramPacket(byte[]buf,intoffset,intlength)
buf:arrayparaalmacenarlosdatosquesevanarecibir offset:desplazamientodentrodelarraydedatosarecibir length:nmeromximodebytesquesevanarecibir
Octubre2007
LaboratoriodeRedesdeComunicaciones
29
UDPServidor(1)
Operacin:
Crearunsocketnoorientadoaconexin. Mientras(durelaejecucindelservidor)
Intercambiodedatos(segnprotocolo):
RecibiryenviarDatagramas
UNIVERSIDADEDACORUA
Cerrarelsocket
Clases:
java.net.DatagramSocket java.net.DatagramPacket
Octubre2007
LaboratoriodeRedesdeComunicaciones
30
UDPServidor(2)
Creacindelsocket(java.net.DatagramSocket)
Constructores:
DatagramSocket() DatagramSocket(intpuerto) DatagramSocket(intpuerto,InetAddressdirIP)
UNIVERSIDADEDACORUA
Mtodos:
voidbind(SocketAddressaddr)
Intercambiodedatos
demcliente.
Cierredelsocket
demcliente.
Octubre2007 LaboratoriodeRedesdeComunicaciones 31
LaboratoriodeRedesdeComunicaciones FlujosdedatosenJava
Flujosdedatos Ficheros
UNIVERSIDADEDACORUA
Flujosdedatos:Introduccin
Losprogramasnecesitan:
Recogerinformacindeunafuenteexterna. Enviarinformacinaundestinoexterno.
UNIVERSIDADEDACORUA
Octubre2007
LaboratoriodeRedesdeComunicaciones
33
Flujosdedatos:Lectura
UNIVERSIDADEDACORUA
Elprogramaabreelflujo(stream)dedatosenlafuente. Elprogramaleelainformacin.
Octubre2007
LaboratoriodeRedesdeComunicaciones
34
Flujosdedatos:Escritura
UNIVERSIDADEDACORUA
Elprogramaabreunflujo(stream)dedatosconeldestino. Escribelainformacin.
Octubre2007
LaboratoriodeRedesdeComunicaciones
35
Flujosdedatos
Lectura
Abrirelflujodedatos Mientrashay informacin Leerinformacin Cerrarelflujodedatos
UNIVERSIDADEDACORUA
Escritura
Abrirelflujodedatos Mientrashay informacin Escribirinformacin Cerrarelflujodedatos
Octubre2007
LaboratoriodeRedesdeComunicaciones
36
Flujosdedatos:Clases
Paquetejava.io Existen4clasesabstractaspadredelrestode clases:
Flujosdebytes
java.io.OutputStream,java.io.InputStream
UNIVERSIDADEDACORUA
Flujosdecaracteres
java.io.Reader,java.io.Writer
Normalmentesonenvoltoriossobreflujosdebytes.
ElflujodebytesseutilizapararealizarlaE/Sfsica,yelflujode caracteresrealizalaconversinentrecaracteresybytes.
LaplataformaJavaalmacenaloscaracteresutilizandoconvenciones Unicode.
Losflujosdecaracterestraducenentreesteformatointernoyeljuegode caractereslocal.
Octubre2007 LaboratoriodeRedesdeComunicaciones 37
Flujosdebytes.Lectura.
Clasejava.io.InputStream:
LeeBYTESunoaunooenunarray. Mtodos:
intread()
Leeunbyte
UNIVERSIDADEDACORUA
intread(bytebuf[])
Leeunconjuntodebytesylosalmacenaenunarray Devuelveelnmerodebytesledos
intread(bytebuf[],intoffset,intlongitud)
Leeunconjuntodebytesylosalmacenaenunaporcindeun array Devuelveelnmerodebytesledos Devuelven1encasodellegaralfinaldelflujodedatos.
voidclose()
Cierraelflujo
Octubre2007 LaboratoriodeRedesdeComunicaciones 38
Flujosdebytes.Escritura.
Clasejava.io.OutputStream:
EscribeBYTESunoaunooatravsunarray. Mtodos:
voidwrite(intc)
Escribeunbyte
UNIVERSIDADEDACORUA
voidwrite(bytebuf[])
Escribeunarraydebytes
write(bytebuf[],intoffset,intlongitud)
Escribeunaporcindeunarraydebytes
voidclose()
Cierraelflujo
Octubre2007
LaboratoriodeRedesdeComunicaciones
39
Flujosdecaracteres.Lectura.
Clasejava.io.Reader:
LeeCARACTERESunoaunooenunarray. Mtodos:
intread()
Leeuncarcter
UNIVERSIDADEDACORUA
intread(charbuf[])
Leeunconjuntodecaracteresylosalmacenaenunarray Devuelveelnmerodecaracteresledos
intread(charbuf[],intoffset,intlen)
Leeunconjuntodecaracteresylosalmacenaenunaporcinde unarray Devuelveelnmerodecaracteresledos
Devuelven1encasodellegaralfinaldelflujodedatos. voidclose()
Cierraelflujo
Octubre2007 LaboratoriodeRedesdeComunicaciones 40
Flujosdecaracteres.Escritura.
Clasejava.io.Writer:
UNIVERSIDADEDACORUA
EscribeCARACTERESunoaunooatravsunarray. Mtodos:
voidwrite(intc)
Escribeuncarcter
voidwrite(charbuf[])
Escribeunarraydecaracteres
voidwrite(charbuf[],intoffset,intlongitud)
Escribeunaporcindeunarraydecaracteres
voidclose()
Cierraelflujo
Octubre2007
LaboratoriodeRedesdeComunicaciones
41
Flujosdedatosorientadosalneas:Lectura
Clasejava.io.BufferedReader:
Clasetilparalalecturadelneasdetexto. Constructor:
BufferedReader(Readerreader)
UNIVERSIDADEDACORUA
Mtodos:
StringreadLine()
Leeunalneadetexto. Devuelvelacadenaledaonullsisealcanzaelfinaldelflujo.
voidclose()
Cierraelflujo
Octubre2007
LaboratoriodeRedesdeComunicaciones
42
Flujosdedatosorientadosalneas:Escritura
Clasejava.io.PrintWriter:
Clasetilparaescribirlneasdecaracteres. Constructores:
PrintWriter(OutputStreamout) PrintWriter(OutputStreamout,booleanautoFlush) PrintWriter(Writerout) PrintWriter(Writerout,booleanautoFlush)
autoFlushindicasiciertosmtodos(incluidoprintln)provocanunflush delbufferdeescritura(pordefectofalse)
UNIVERSIDADEDACORUA
Mtodos:
voidprintln(Stringx)
Escribelacadenaespecificadamsunfindelnea
voidflush()
Escribeloquehayaenelbufferdeescritura
voidclose()
Cierraelflujo
Octubre2007 LaboratoriodeRedesdeComunicaciones 43
Conversinentreflujosdedatos
Clasejava.io.InputStreamReader:
ClasetilparalaconversindeobjetosInputStreamaReader. HeredadeReader. Constructor:
InputStreamReader(InputStreamin)
UNIVERSIDADEDACORUA
Clasejava.io.OutputStreamWriter:
ClasetilparalaconversindeobjetosOutputStreamaWriter. HeredadeWriter. Constructor:
OutputStreamWriter(OutputStreamout)
Octubre2007
LaboratoriodeRedesdeComunicaciones
44
Ficheros
UNIVERSIDADEDACORUA
Octubre2007
LaboratoriodeRedesdeComunicaciones
45
Clasejava.io.File(1)
Mtodos
StringgetName()
Devuelveelnombredelficheroodirectorio
UNIVERSIDADEDACORUA
StringgetParent()
Devuelveelpathdeldirectoriopadreonullsinotiene.
StringgetPath()
Devuelveelpath
StringgetAbsolutePath()
Devuelveelpathabsoluto
longlastModified()
Devuelvelahoradelaltimamodificacin.
longlength()
Devuelveeltamao.
Clasejava.io.File(2)
Mtodos
booleandelete()
Borraelficheroodirectorio
UNIVERSIDADEDACORUA
booleanrenameTo(Filedest)
Renombraelficheroodirectorio
booleanexists()
Indicasiexisteunficheroodirectorioconesenombre
booleanisDirectory()
Indicasisetratadeundirectorio.
booleanisFile()
Indicasisetratadeunfichero
booleancreateNewFile()
Creaunficherovacoconestenombresinoexistaya.
booleanmkdir()
Creaundirectorioconestenombre
booleanmkdirs()
Creaundirectorioconestenombrecreandotodoslosdirectoriospadrequeseanecesario
String[]list()
Obtieneunalistadelosficherosydirectorioscontenidosenestedirectorio.
Octubre2007
LaboratoriodeRedesdeComunicaciones
47
Ficheros.Flujosdebytes:Lectura
Clasejava.io.FileInputStream:
LeeBYTESdeunfichero.Accesosecuencial.
UNIVERSIDADEDACORUA
AperturadeunFileInputStream: Atravsdelconstructor:
FileInputStream(Filefile) FilemiFichero=newFile("/etc/ejemplo"); FileInputStreamfis=newFileInputStream(miFichero); FileInputStream(Stringname) FileInputStreamfis=newFileInputStream("/etc/ejemplo");
Lecturaycierre:MismosmtodosqueInputStream.
Octubre2007 LaboratoriodeRedesdeComunicaciones 48
Ficheros.Flujosdebytes:Escritura
Clasejava.io.FileOutputStream:
EscribeBYTESenunfichero.
UNIVERSIDADEDACORUA
AperturadeunFileOutputStream: Atravsdelconstructor:
FileOutputStream(Filefile) FileOutputStream(Filefile,booleanappend) FileOutputStream(Stringname) FileOutputStream(Stringname,booleanappend)
appendindicasiloqueseescribeseaadealfinaldelfichero
Escrituraycierre:MismosmtodosqueOutputStream.
Octubre2007 LaboratoriodeRedesdeComunicaciones 49
Ficheros.Flujosdecaracteres:Lectura
Clasejava.io.FileReader:
LeeCARACTERESdeunfichero.Accesosecuencial.
UNIVERSIDADEDACORUA
AperturadeunFileReader: Atravsdelconstructor:
FileReader(Filefile) FileReader(Stringname)
Lecturaycierre:MismosmtodosqueReader.
Octubre2007
LaboratoriodeRedesdeComunicaciones
50
Ficheros.Flujosdecaracteres:Escritura
Clasejava.io.FileWriter:
EscribeCARACTERESenunfichero.
UNIVERSIDADEDACORUA
AperturadeunFileWriter: Atravsdelconstructor:
FileWriter(Filefile) FileWriter(Filefile,booleanappend) FileWriter(Stringname) FileWriter(Stringname,booleanappend)
appendindicasiloqueseescribeseaadealfinaldelfichero
Escrituraycierre:MismosmtodosqueWriter.
Octubre2007 LaboratoriodeRedesdeComunicaciones 51
StreamsdeE/Sestndar
Entradaestndar.
Paraleerdatosintroducidosporelusuario. System.in DetipoInputStream.
UNIVERSIDADEDACORUA
Salidaestndarysalidadeerror.
Paramostrarinformacinymensajesdeerroralusuario. System.out,System.err DetipoPrintStream.
Desciendedejava.io.OutputStream Tienemtodosparaescribircaracteres(print,println)queaceptan parmetrosdediferentestipos(Object,String,char[],char,int,long, float,double,yboolean) Tienemtodosparaescribirbytes:mtodoswritedeOutputStream.
Octubre2007 LaboratoriodeRedesdeComunicaciones 52
LaboratoriodeRedesdeComunicaciones ProgramacinConcurrente
Threads
UNIVERSIDADEDACORUA
ProgramacinMultithread
UNIVERSIDADEDACORUA
Laprogramacinmultihilopermiterealizarmuchas actividadessimultneasenunprograma.Loshilosaveces llamados,procesosligeros,ohilosdeejecucinson ejecucionesconcurrentesdeunprogramadondese compartendiversosrecursosentrelosdistintosthreads.Al estarestoshilosconstruidosenelmismolenguaje,sonms fcilesdeusarquesushomlogosenCoC++. Elbeneficiodesermultihiloconsisteenunmejor rendimientointeractivoyunamayorfacilidadpara modelarprocesosconcurrentes(comounservidoren Internetquedebeatenderamltiplesclientesdeforma simultnea).
Octubre2007
LaboratoriodeRedesdeComunicaciones
54
Threads:Introduccin(I)
UNIVERSIDADEDACORUA
Threads:Introduccin(II)
ThreadsvsProcesos
UNIVERSIDADEDACORUA
Alcompartirrecursos,losthreadssecreanmsrpidoquelos procesosyloscambiosdecontextoentrethreadssonmsbaratos.Esta ventajadelosthreadsvaramuchosegnelSO,siendomsgrandeen Windows(dondelacreacindeprocesosesmuycostosa). Comocontrapartida,elmayoraislamientoqueproporcionanlos procesoshacemsfcilevitarproblemasquesurgendelaejecucin concurrentesobrelosmismosrecursos. Ambasaproximacionessepuedencombinarenunmismoprograma, quepuedetenervariosprocesos,ycadaunodeellosconvarios threadssimultneos.
LaboratoriodeRedesdeComunicaciones 56
Octubre2007
Threads:Introduccin(III)
Unprogramaconcurrenteejecutamltiplesthreads simultneamente,cadaunorealizandodiferentestareas.
UNIVERSIDADEDACORUA
Octubre2007
LaboratoriodeRedesdeComunicaciones
57
Threads:Introduccin(IV)
Javaesmultithread
UNIVERSIDADEDACORUA
Permitelarealizacindeprogramasdeflujomltiple:
Programasqueejecutansimultneamentemltiplestareas. Porejemplo:
NavegadorquedescargapginasWeb:unthreadparalapgina HTML,otroparacadaimagen,etc.
Octubre2007
LaboratoriodeRedesdeComunicaciones
58
Threads:Introduccin(V)
Razonesparautilizarmultithreading
UNIVERSIDADEDACORUA
Ejemplos:
Servidoresqueaceptanconexionesdemltiplesclientes (ServidoresWeb,FTP,correo,) Almacenarunarchivoendisco. Mostrarunabarradeprogresodeunaoperacindeunaaplicacin.
Octubre2007 LaboratoriodeRedesdeComunicaciones 59
Threads:Java(I)
Javaparalacreacindethreadsdisponededos mecanismos:
Laclasejava.lang.Thread
Seutilizacuandosepuedeheredardirectamente.
UNIVERSIDADEDACORUA
Lainterfazjava.lang.Runnable
Seutilizaenloscasosdequeseanecesariolaherenciamltiple
(porejemplocuandounaclaseyaheredadeotra,comounApplet).
NOTA:
MtodoestticoThread.sleep(intmilisegs):duermeunprocesoo unthreadduranteeltiempoespecificado.
Octubre2007
LaboratoriodeRedesdeComunicaciones
60
Threads:Java(II)
HeredardelaclaseThread. Definirunconstructor. Sobrescribirelmtodorun():
publicvoidrun()
}
UNIVERSIDADEDACORUA
Mtodo1:Paracrearunaclasequeseaunthread(unhilo deejecucinindependiente):
class HijoThread extends Thread { HijoThread() { // Inicializacin } public void run() { // Tarea a ejecutar en el thread ... }
Elprogramaprincipal:
Creaunainstanciadelanuevaclase:
HijoThreadt=newHijoThread();
Inicialaejecucin:
t.start();
Octubre2007
LaboratoriodeRedesdeComunicaciones
61
Threads:Java(III)
Mtodo2:Encasodeutilizarherenciamltiple:
DeclararunaclasequeimplementelainterfazRunnable. class HijoRunnable implements Defineunconstructor. HijoRunnable() { // Inicializacin Sobrescribirelmtodrun().
publicvoidrun()
}
UNIVERSIDADEDACORUA
Runnable{
Elprogramaprincipal:
Creaunainstanciadelanuevaclase:
HijoRunnablerunnable=newHijoRunnable();
Creaunthreadpasndolecomoparmetrolanuevaclase:
Threadt=newThread(runnable);
Inicialaejecucindelthread:
t.start();
Octubre2007 LaboratoriodeRedesdeComunicaciones 62
Msinformacin
http://java.sun.com/docs/books/tutorial/
http://java.sun.com/docs/books/tutorial/reallybigindex.html
UNIVERSIDADEDACORUA
ProgramacinconSockets
http://java.sun.com/docs/books/tutorial/networking/sockets/index.html (Sockets) http://java.sun.com/docs/books/tutorial/networking/datagrams/index.html (Datagramas)
Flujosdedatos
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)
Programacinconcurrente
http://java.sun.com/docs/books/tutorial/essential/concurrency/threads.html (Threads)
Octubre2007
LaboratoriodeRedesdeComunicaciones
63