Unidad 2 Programación Cliente/Servidor de bajo nivel Sockets y Canales
Los sockets no so son n má más s qu que e pu punt ntos os o me meca cani nism smos os de co comu muni nica caci ción ón en entr tre e
procesos que permiten que un proceso hable ( emita o reciba información ) con otro otr o pro proces ceso o inc inclus luso o es estan tando do es estos tos pro proces cesos os en dis distin tintas tas máq máquin uinas. as. Est Esta a característica de interconectividad entre máquinas hace que el concepto de socket nos sirva de gran utilidad. Esta interfaz de comunicaciones es una de las distribuciones de erkele! al sistema "#$%& implementándose las utilidades rlogin gin,, tel telnet net,, ftp ftp,, ... ) usando de interconectividad de este 'istema perativo ( rlo sockets. "n socket es al sistema de comunicación entre ordenadores lo que un buzón o un telfono es al sistema de comunicación entre personas* un punto de comunicación entre dos agentes ( procesos o personas respectivamente ) por el cual se puede emitir o recibir información. La forma de referenciar un socket por los procesos implicados es mediante un descriptor del del mismo tipo que el utiliz uti lizado ado par para a ref refere erenci nciar ar fic ficher heros. os. +eb +ebido ido a est esta a car caract acterí erísti stica& ca& se pod podrá rá realizar redirecciones de los archivos de E,' estándar (descriptores -& ! /) a los sockets ! así combinar entre ellos aplicaciones de la red. 0odo nuevo proceso creado heredará& por tanto& los descriptores de sockets de su padre. La co comu muni nica caci ción ón en entr tre e pr proc oces esos os a tr trav avs s de soc ocke kets ts se ba basa sa en la filosofía CLIENE!SE"#I$%" * un proceso en esta comunicación actuará de proceso servidor creando creando un socket cu!o nombre conocerá el proceso cliente & el cual podrá 1hablar1 con el proceso servidor a travs de la cone2ión con nombrado . dicho socket El proceso crea un socket sin nombre cu!o valor de vuelta es un descriptor sobre el que se leerá o escribirá& permitindose una comunicación bidireccional & característica propia de los sockets ! que los diferencia de los pipes& o canales de co comun munica icació ción n uni unidir direcc eccion ional al ent entre re pro proces cesos os de un una a mis misma ma máq máquin uina. a. El meca me cani nism smo o de co comu muni nica caci ción ón ví vía a so sock cket ets s tie tiene ne lo los s si sigu guie ient ntes es pa paso sos* s* 3)) El pr 3 proc oce eso ser erv vid idor or cre rea a un so sock cket et con no nomb mbre re ! es esp per era a la cone2ión. /3) El proceso cliente crea un socket sin nombre. 43)) El pr 43 proc oces eso o cl clie ient nte e re real aliz iza a un una a pe peti tici ción ón de co cone ne2i 2ión ón al so sock cket et servidor. 53)) El cl 53 clie ient nte e re real aliz iza a la co cone ne2i 2ión ón a tr trav avs s de su so sock cket et mi mien entr tras as el proceso serv rviidor ma man ntie ien ne el socket serv rviidor original con nombre.
Es mu! com6n en este tipo de comunicación lanzar un proceso hi7o& una vez realizada la cone2ión& que se ocupe del intercambio de información con el proc pr oces eso o cl clie ient nte e mi mien entr tras as el pr proc oces eso o pa padr dre e se serv rvid idor or si sigu gue e ac acep epta tand ndo o cone2iones. 8ara eliminar esta característica se cerrará el descriptor del socket servidor con nombre en cuanto realice una cone2ión con un proceso socket cliente. 9: 0odo so sock cket et vi vien ene e de defin finid ido o po porr do dos s ca cara ract cter erís ístic ticas as fu fund ndam amen enta tale les* s*
9 El tipo del socket& que indica la naturaleza del mismo& el tipo de comunicación que puede generarse entre los sockets. 9 El dominio del socket especifica el con7unto de sockets que pueden establecer una comunicación con el mismo.
;amos
a
estudiar
&'('!
con
más
detalle
ipos
estos
dos
aspectos*
de
sockets'
+efine las propiedades de las comunicaciones en las que se ve envuelto un socket& esto es& el tipo de comunicación que se puede dar entre cliente ! servidor. Estas pueden ser* 9
onectado1 en la comunicación. 9 Envío de mensa7es urgentes. Los
tipos
disponibles
son
los
siguientes*
? 0ipo S%C)*$+",- * sockets para comunicaciones en modo no conectado & con envío de datagramas de tama@o limitado ( tipo telegrama ). En dominios $nternet como la que nos ocupa el protocolo del nivel de transporte sobre el que se basa es el U$P. ? 0ipo S%C)*S"E,- * para comunicaciones .iables en modo conectado& de dos vas ! con tama@o variable de los mensa7es de datos. 8or deba7o& en dominios $nternet& sub!ace el protocolo CP. ? 0ipo S%C)*",0* permite el acceso a protocolos de más ba7o nivel como el IP ( nivel de red ) ? 0ipo S%C)*SE1P,C)E* tiene las características del '>AB'0CED= pero además el tama@o de los mensa7es es fi7o. &'2'!
El
dominio
de
n
socket'
$ndica el formato de las direcciones que podrán tomar los sockets ! los protocolos que soportarán dichos sockets. La estructura genrica es strct **s4ort c4ar 95
8ueden
sockaddr sa**.amily5 sa**data7(&85
/6 /6
.amilia dirección
3 6/ 6/
ser*
?
+ominio ,:*UNI; (
Dddress
"#
%$)*
El cliente ! el servidor deben estar en la misma máquina. +ebe incluirse el fichero cabecera /sr/inclde/sys/n'4. La estructura de una dirección en este dominio es* strct s4ort c4ar 95
sn**.amily5 sn**data7(<=85
/6
sockaddr**n en este /6
caso ,:*UNI; dirección
3 6/ 6/
?
+ominio ,:*INE ( Dddress /sr/inclde/arpa/inet'4> /sr/inclde/netdb'4 . La estructura de una dirección en este dominio es* strct **long
in**addr
3
sockaddr**in /6 en este caso /6 nmero del sin**addr5 /6 direcc /6 campo de =
3 6/ 6/ 6/ 6/
s**addr5
95 strct s4ort sin*.amily5 **s4ort sin*port5 strct in**addr c4ar sin*?ero7=85 95
,:*INE perto Internet ceros
Estos dominios van a ser los utilizados en 2shine. 8ero e2isten otros como* ? 'ervidor
!
cliente
deben
estar
?
en
+ominio ,:*NS* una red %EC%. +ominio ,:*CCI*
8ara protocolos >>$00& protocolos %/& .
Transcripción de Creacion / Implementación y Supresión de Sockets Creacion / Implementación y Supresión de Sockets Creación Cuando se escriben programas Java que se comunican a través de la red, se está programando en la capa de aplicación. Típicamente, no se necesita trabajar con las capas TCP y !P, en su lugar se puede utili"ar las clases del paquete java.net. #stas clases proporcionan comunicación de red independiente del sistema. $mplementación %upresión
%iempre deberemos cerrar los canales de entrada y salida que se &ayan abierto durante la ejecución de la aplicación. #s importante destacar que el orden de cierre es relevante. #s decir, se deben cerrar primero los streams relacionados con un soc'et antes que el propio soc'et, ya que de esta (orma evitamos posibles errores de escrituras o lecturas sobre descriptores ya cerrados. ) %oc'et* $mplementa un e+tremo de la cone+ión TCP. ) %erver%oc'et* %e encarga de implementar el e+tremo %ervidor de la cone+ión en la que se esperarán las cone+iones de los clientes. ) !atagram%oc'et* $mplementa tanto el servidor como el cliente cuando se utili"a !P. ) !atagramPac'et* $mplementa un datagram pac'et, que se utili"a para la creación de servicios de reparto de paquetes sin cone+ión. %ervidor %oc'et mi%ervicio try mi%ervicio ne/ %erver%oc'et0 numeroPuerto 1 2 catc&0 $3#+ception e 1 %ystem.out.println0 e 1 2 Cliente %oc'et miCliente try miCliente ne/ %oc'et0 4maquina4,numeroPuerto 1 2 catc&0 $3#+ception e 1 %ystem.out.println0 e 1 2 $mplementar un %ervidor 5 la &ora de la implementación de un servidor también necesitamos crear un objeto soc'et desde el %erver%oc'et para que esté atento a las cone+iones que le puedan reali"ar clientes potenciales y poder aceptar esas cone+iones* %oc'et soc'et%ervicio null
try soc'et%ervicio mi%ervicio.accept01 2 catc&0 $3#+ception e 1 %ystem.out.println0 e 1 2 %treams !ata$nput%tream entrada try entrada ne/ !ata$nput%tream0 soc'et%ervicio.get$nput%tream01 1 2 catc&0 $3#+ception e 1 %ystem.out.println0 e 1 2 Print%tream salida try salida ne/ Print%tream0 miCliente.get3utput%tream01 1 2 catc&0 $3#+ception e 1 %ystem.out.println0 e 1 2 Cerrar %oc'ets #n la parte del cliente* try salida.close01 entrada.close01 miCliente.close01 2 catc&0 $3#+ception e 1 %ystem.out.println0 e 1 2 6 en la parte del servidor* try salida.close01 entrada.close01 soc'et%ervicio.close01 mi%ervicio.close01 2 catc&0 $3#+ception e 1 %ystem.out.println0 e 1 2