UNIVERSIDADE DA CORUÑA Departamento de Tecnoloxías da Información e as Comnicacións
LABORATORIO DE RC: TUTORIAL DE SOCKETS EN JAVA
Í ndice 1. Presentación.......................................................................................................................3 2. Conceptos básicos.............................................................................................................4 2.1. TCP..............................................................................................................................4 2.2. UDP............................................................................................................................4 3. Sockets...............................................................................................................................5 3.1. Sockets en Java..........................................................................................................5 4. Sockets UDP......................................................................................................................6 4.1. Ejercicio 1: Implementación del servidor de eco UDP................................................8 4.2. Preguntas UDP.........................................................................................................10 5. Sockets TCP.....................................................................................................................11 5.1. Ejercicio 2: Implementación del servidor de eco TCP...............................................13 5.2. Preguntas TCP..........................................................................................................17 6. Lectura recomendada......................................................................................................18
1. Presentación El la!oratorio de Redes de Comnicaciones constar" de n con#nto de pr"cticas no obligatorias$ %ara la ela!oración de las pr"cticas se dispondr" del la!oratorio &$& ' todas ellas (an de ser reali)adas individual!nt!$ *a e+alación de la primera pr"ctica consistir" en na defensa ante el profesor de pr"cticas ' para las dos ,ltimas se reali)ar"n dos pe-e.os ex"menes en el propio la!oratorio$ Este ttorial proporciona na introdcción a los soc/ets en 0a+a$ *a parte pr"ctica de dic(o ttorial NO ser" e+alada1 si !ien es m' recomenda!le la reali)ación de la misma$ Cada pr"ctica constar" de n ennciado en donde se plantear"n las tareas a reali)ar1 ' podr" inclir información complementaria para el desarrollo de la misma$ *as pr"cticas -e re-ieran el empleo de n len2a#e de pro2ramación de!er"n ser reali)adas en Java$
2. Conceptos básicos En clase de teoría se (a mencionado en repetidas ocasiones la pila de protocolos TC%3I%1 -e permite la transmisión de datos entre redes de comptadores$ Dic(a pila consta de na serie de capas tal ' como se pede apreciar en el dia2rama si2iente4
Normalmente1 cando se escri!en aplicaciones 0a+a en red tra!a#aremos con el ni+el de aplicación1 ' tili)aremos adem"s protocolos del ni+el de transporte$ %or este moti+o es preciso recordar las principales diferencias entre los dos protocolos !"sicos del ni+el de transporte4 TC% 5Transmission Control %rotocol6 ' UD% 5User Data2ram %rotocol6$
2.1. TCP •
•
•
Es n protocolo orientado a conexión %ro+ee n fl#o de !'tes fia!le entre dos ordenadores 5lle2ada en orden1 correcta1 sin p7rdidas 8 control de fl#o1 control de con2estión$$$6 %rotocolos de ni+el de aplicación -e san TC%4 telnet1 9TT%1 :T%1 S;T%$$$
2.2. UDP •
•
•
•
Es n protocolo no orientado a conexión En+ía pa-etes de datos 5data2ramas6 independientes sin 2arantías %ermite !roadcast ' mlticast %rotocolos de ni+el de aplicación -e san UD%4 DNS1 T:T%$$$
3. Sockets Cando estamos tra!a#ando en na red de ordenadores ' -eremos esta!lecer na comnicación 5reci!ir o en+iar datos6 entre dos procesos -e se est"n e#ectando en dos m"-inas diferentes de dic(a red1 <-7 necesitamos para -e dic(os procesos se pedan comnicar entre sí= Spon2amos -e na de las aplicaciones solicita n ser+icio 5cliente61 ' la otra lo ofrece 5ser+idor6$ Una misma m"-ina pede tener na o +arias conexiones físicas a la red ' m,ltiples ser+idores peden estar escc(ando en dic(a m"-ina$ Si a tra+7s de na de dic(as conexiones físicas se reci!e na petición por parte de n cliente
?@ !its1 ' si I%+ &@B !its6 ' el perto 5& !its6 a los -e +an diri2idos$ *os pertos4 son independientes para TC% ' UD% se identifican por n n,mero de & !its 5de a ?6 al2nos de ellos est"n reser+ados 5de a &@?61 pesto -e se emplean para ser+icios conocidos como 9TT%1 :T%1 etc$ ' no de!erían ser tili)ados por aplicaciones de sario$ %or tanto1 n so#$!t se pede definir como n extremo de n enlace de comnicación !idireccional entre dos pro2ramas -e se comnican por la red 5se asocia a n n,mero de perto6$ Se identifica por na dirección I% de la m"-ina ' n n,mero de perto$ Existe tanto en TC% como n UD%$ •
•
•
•
•
3.1. Sockets en Java 0a+a incl'e la li!rería java.net para la tili)ación de soc/ets1 tanto TC% como UD%$ Este ttorial se !asa exclsi+amente en clases ' m7todos de esta li!rería1 por lo -e ser" necesario importarla en todos los e#emplos ' pr"cticas$
4. Sockets UDP *os soc/ets UD% son no orientados a conexión$ *os clientes no se conectar"n con el ser+idor sino -e cada comnicación ser" independiente1 sin poderse 2aranti)ar la recepción de los pa-etes ni el orden de los mismos$ Es en este momento en donde podemos definir el concepto de datagraa1 -e no es m"s -e n mensa#e independiente1 en+iado a tra+7s de na red c'a lle2ada1 tiempo de lle2ada ' contenido no est"n 2aranti)ados$ En primer l2ar1 +amos a implementar n cliente de eco UD%$ El formato de e#ección ser"4 java ClienteUDP
En donde1 –
máquina_servidor ser" el nom!re 5o la dirección I%6 de la m"-ina en donde se
est" e#ectando n ser+idor de eco UD%$ puerto_servidor ser" el perto en el -e est" escc(ando el ser+idor de eco UD%$ mensaje ser" el mensa#e -e -eremos en+iar$ A continación se mestra el códi2o fente del cliente de eco UD%$ –
–
import java.net.*;
/** Ejemplo que implementa un cliente de eco usando UDP. */ public class ClienteUDP public static void main!"trin# ar#v$%& if !ar#v.len#t' () & "+stem.err.println!,-ormato ClienteUDP ,&; "+stem.eit!01&; 2
Data#ram"oc3et sData#ram ) null; try
// Creamos el soc3et no orientado a conei4n // !en cualquier puerto li5re& sData#ram ) new Data#ram"oc3et!&; // Esta5lecemos un timeout de 6 se#s sData#ram.set"o7imeout!6666&;
// 85tenemos la direcci4n 9P del servidor // !reci5ida en el primer ar#umento por linea de comandos& 9net:ddress dir"ervidor ) 9net:ddress.#et+ame!ar#v$6%&; // 85tenemos el puerto del servidor // !reci5ido en el se#undo ar#umento por linea de comandos& int puerto"ervidor ) 9nte#er.parse9nt!ar#v$1%&; // 85tenemos el mensaje // !tercer ar#umento de la linea de comandos& "trin# mensaje ) ar#v$=%; // Preparamos el data#rama que vamos a enviar + lo enviamos Data#ramPac3et d#ramEnv ) new Data#ramPac3et!mensaje.#et+tes!& mensaje.#et+tes!&.len#t' dir"ervidor puerto"ervidor&; // Enviamos el data#rama sData#ram.send!d#ramEnv&; "+stem.out.println!,C?9E7E Enviando , @ new "trin#!d#ramEnv.#etData!&& @ , a , @ d#ramEnv.#et:ddress!&.to"trin#!& @ ,, @ d#ramEnv.#etPort!&&;
// Preparamos el data#rama de recepci4n byte arra+$% ) new byte$16=A%; Data#ramPac3et d#ramBec ) new Data#ramPac3et!arra+ arra+.len#t'&; // Beci5imos el mensaje sData#ram.receive!d#ramBec&; "+stem.out.println!,C?9E7E Beci5ido , @ new "trin#!d#ramBec.#etData!& 6 d#ramBec.#et?en#t'!&& @ , de , @ d#ramBec.#et:ddress!&.to"trin#!& @ ,, @ d#ramBec.#etPort!&&;
2 catch !"oc3et7imeoutEception e& "+stem.err.println!,6 se#s sin reci5ir nada,&; 2 catch !Eception e& "+stem.err.println!,Error , @ e.#etessa#e!&&; 2 inall+ // Cerramos el soc3et para li5erar la conei4n sData#ram.close!&; 2
2
De manera m"s detallada1 estos son los pasos -e se e#ectan en el cliente4 &$ Se crea n soc/et no orientado a conexión$ Es importante recalcar -e no es necesario especificar n n,mero de perto en el constrctor1 'a -e el propio constrctor se encar2ar" de seleccionar n perto li!re 5perto efímero6$ %ara m"s información +er la docmentación de la clase Data#ram"oc3et !en especial la sección de constrctores6$ @$ Esta!lecemos n tiempo de espera m"ximo para el soc/et$ Si pasado ese tiempo no (a reci!ido nada se lan)ar" la excepción correspondiente$ ?$ Se o!tiene la dirección I% de la m"-ina en la -e se encentra el ser+idor1 a partir del primer ar2mento reci!ido por línea de comandos$ *a clase 9net:ddress representa en 0a+a el concepto de dirección I%$ Esta clase dispone del m7todo est"tico #et+ame!& -e o!tiene la dirección I% a partir del "trin# -e reci!e como par"metro$ Este par"metro pede ser n nom!re o na dirección I%$ >$ Se o!tiene el n,mero de perto en el -e est" e#ect"ndose el ser+idor1 a partir del se2ndo ar2mento reci!ido por línea de comandos$ $ Se o!tiene el mensa#e -e -eremos en+iar al ser+idor1 a partir del tercer ar2mento reci!ido por línea de comandos$ En caso de -erer en+iar +arias pala!ras es necesario tili)ar comillas do!les 5p$e$ FEsto es na pre!aG6$ $ %reparamos el data2rama -e +amos a en+iar1 indicando4 el mensa#e -e -eremos en+iar 5como n arra' de !'tes61 el n,mero de !'tes a en+iar1 la dirección I% del destinatario ' el perto del destinatario$ Ver la clase Data#ramPac3et$ H$ En+iamos el data2rama in+ocando el m7todo send!& del soc/et -e (emos creado inicialmente$ B$ %reparamos n ne+o data2rama para reci!ir la respesta del ser+idor$ %ara ello1 es necesario crear pre+iamente n arra' de !'tes -e +a a almacenar la respesta -e +a'amos a reci!ir$ Al crear el ne+o data2rama1 se indicar" el arra' en donde -eremos almacenar la respesta ' el n,mero m"ximo de !'tes -e pede almacenar este arra'$ $ Reci!imos el data2rama1 tili)ando el m7todo receive!& de nestro soc/et UD%$ Este m7todo es !lo-eante1 es decir1 el pro2rama se -edar" esperando en este m7todo (asta reci!ir al2o o1 como (emos esta!lecido n timeot1 (asta -e +en)a el timeot$ &$%or ,ltimo1 cerramos el soc/et$
del servidor de eco UDP 4.1. Ejercicio 1: Implementaci ón
En !ase al cliente de eco UD%1 implementa n ser+idor de eco UD%$ El ser+idor de!er" se2ir los si2ientes pasos4 & Crear n Data#ram"oc3et1 pero asociado a n n,mero de perto específico$ @ Esta!lecer n tiempo de espera m"ximo para el soc/et$ ? Crear n !cle infinito4 ?$& %reparar n data2rama para reci!ir mensa#es de los clientes$ Es
recomenda!le crear n ne+o o!#eto Data#ramPac3et para cada mensa#e -e se +a'a a reci!ir$ ?$@ Reci!ir n mensa#e$ ?$? %reparar el data2rama de respesta para en+iar al cliente$ Recerda -e en cada data2rama reci!ido -eda re2istrado la dirección I% ' el n,mero de perto del remitente$ ?$> En+iar el mensa#e de respesta$ A continación se mestra el psedoJcódi2o del ser+idor4 import java.net.*;
/** Ejemplo que implementa un servidor de eco usando UDP. */ public class "ervidorUDP public static void main!"trin# ar#v$%& if !ar#v.len#t' () 1& "+stem.err.println!,-ormato "ervidorUDP ,&; "+stem.eit!01&; 2 try // Creamos el soc3et del servidor // Esta5lecemos un timeout de 6 se#s while !true& // Preparamos un data#rama para recepci4n // Beci5imos el mensaje // Preparamos el data#rama que vamos a enviar // Enviamos el mensaje 2 2 catch !"oc3et7imeoutEception e& "+stem.err.println!,6 se#s sin reci5ir nada,&; 2 catch !Eception e& "+stem.err.println!,Error , @ e.#etessa#e!&&; e.print"tac37race!&; 2 inall+ // Cerramos el soc3et 2
2 2
Una +e) finali)ado el ser+idor de eco UD%1 para compro!ar -e fnciona correctamente de!er"s e#ectar en n terminal el ser+idor4 java "ervidorUDP 666
El ser+idor se -edar" esperando a -e los clientes le en+íen peticiones$ En otro terminal1 de!er"s e#ectar el cliente UD%4 java ClienteUDP local'ost 666 FPro5ando mi servidor UDPG
El resltado de!ería ser -e el ser+idor reci!iese el mensa#e del cliente ' se lo reen+iase1 mientras -e el cliente de!ería reci!ir la respesta del ser+idor$
4.2. Preguntas UDP Una +e) -e (a'as implementado el ser+idor UD%1 responde a las si2ientes pre2ntas4 &$ $
5. Sockets TCP *os soc/ets TC% son orientados a conexión ' fia!les$ Esto implica -e antes de poder en+iar ' reci!ir datos es necesario esta!lecer na conexión entre el cliente ' el ser+idor$ Una +e) -e la conexión est" esta!lecida1 el protocolo TC% 2aranti)a -e los datos en+iados son reci!idos correctamente ' de!idamente ordenados en el otro extremo$ En primer l2ar1 +amos a implementar n cliente de eco TC%$ El formato de e#ección ser"4 java Cliente7CP
En donde1 –
máquina_servidor ser" el nom!re 5o la dirección I%6 de la m"-ina en donde se
est" e#ectando n ser+idor de eco TC%$ puerto_servidor ser" el perto en el -e est" escc(ando el ser+idor de eco TC%$ mensaje ser" el mensa#e -e -eremos en+iar$ A continación se mestra el códi2o fente del cliente de eco TC%$ –
–
import java.net.*; import java.io.*;
/** Ejemplo que implementa un cliente de eco usando 7CP. */ public class Cliente7CP public static void main!"trin# ar#v$%& if !ar#v.len#t' () & "+stem.err.println!,-ormato Cliente7CP ,&; "+stem.eit!01&; 2
"oc3et soc3et ) null; try // 85tenemos la direcci4n 9P del servidor 9net:ddress dir"ervidor ) 9net:ddress.#et+ame!ar#v$6%&; // 85tenemos el puerto del servidor int puerto"ervidor ) 9nte#er.parse9nt!ar#v$1%&; // 85tenemos el mensaje "trin# mensaje ) ar#v$=%; // Creamos el soc3et + esta5lecemos la conei4n con el servidor soc3et ) new "oc3et!dir"ervidor puerto"ervidor&; // Esta5lecemos un timeout de 6 se#s soc3et.set"o7imeout!6666&;
"+stem.out.println!,C?9E7E Coneion esta5lecida con , @ dir"ervidor.to"trin#!& @ , al puerto , @ puerto"ervidor&; // Esta5lecemos el canal de entrada ueredBeader sEntrada ) new ueredBeader!new 9nput"treamBeader! soc3et.#et9nput"tream!&&&; // Esta5lecemos el canal de salida PrintHriter s"alida ) new PrintHriter!soc3et.#et8utput"tream!& true&;
"+stem.out.println!,C?9E7E Enviando , @ mensaje&; // Enviamos el mensaje al servidor s"alida.println!mensaje&;
// Beci5imos la respuesta del servidor "trin# reci5ido ) sEntrada.read?ine!&;
"+stem.out.println!,C?9E7E Beci5ido , @ reci5ido&; // Cerramos los lujos + el soc3et para li5erar la conei4n s"alida.close!&; sEntrada.close!&;
2 catch !"oc3et7imeoutEception e& "+stem.err.println!,6 se#s sin reci5ir nada,&; 2 catch !Eception e& "+stem.err.println!,Error , @ e.#etessa#e!&&;
2 finally try soc3et.close!&; 2 catch !98Eception e& e.print"tac37race!&; 2 2 2 2
De manera m"s detallada1 estos son los pasos -e se e#ectan en el cliente4 &$ Se o!tiene la dirección I% de la m"-ina en la -e se encentra el ser+idor1 a partir del primer ar2mento reci!ido por línea de comandos$ @$ Se o!tiene el n,mero de perto en el -e est" e#ect"ndose el ser+idor1 a partir del se2ndo ar2mento reci!ido por línea de comandos$ ?$ Se o!tiene el mensa#e -e -eremos en+iar al ser+idor1 a partir del tercer ar2mento reci!ido por línea de comandos$ >$ Se crea n soc/et orientado a conexión$ No se especifica nin2,n perto para el cliente1 'a -e atom"ticamente se seleccionar" n perto li!re 5efímero6$ En el constrctor se especifica la dirección I% ' el perto del ser+idor1 esta!leci7ndose inmediatamente desp7s de la creación del soc/et1 la conexión con el ser+idor$ %ara m"s información +er la docmentación de la clase "oc3et1 en especial la sección de constrctores$ $ Esta!lecemos n tiempo de espera m"ximo para el soc/et$ Si pasado ese tiempo no (a reci!ido nada se lan)ar" la excepción correspondiente$ $ Creamos el canal de entrada para reci!ir los datos del ser+idor$ %ara leer los datos del ser+idor se tili)a la clase ueredBeader1 constrida a partir del m7todo #et9nput"tream!& del soc/et cliente$ Esta clase dispone del m7todo read?ine!& -e permite la lectra línea a línea$ H$ Creamos el canal de salida para en+iar datos al ser+idor$ Se tili)a la clase PrintHriter1 constrida a partir del m7todo #et8utput"tream!& del soc/et cliente$ Esta clase dispone de los m7todos println!& ' print!&1 e-i+alentes a los tili)ados (a!italmente para imprimir por pantalla$ B$ En+iamos el mensa#e al ser+idor in+ocando el m7todo println!& del fl#o de salida$ $ Esperamos ' reci!imos la respesta del ser+idor in+ocando el m7todo read?ine!& del fl#o de entrada$ &$%or ,ltimo1 cerramos el soc/et$
5.1. Ejercicio 2: Implementaci ón del servidor de eco TCP En !ase al cliente de eco TC%1 implementa n ser+idor ulti%ilo de eco TC%$ 9a!italmente1 los ser+idores TC% son mlti(ilo para poder procesar m,ltiples conexiones simlt"neamente$ %ara facilitar s implementación se recomienda reali)ar na primera +ersión del ser+idor mono(ilo1 ' compro!ar s fncionamiento con el cliente de eco TC%$ Una +e) la +ersión mono(ilo fncione correctamente1 se pede reali)ar la +ersión mlti(ilo$ El ser+idor mono(ilo de!er" se2ir los si2ientes pasos4 & Crear n "erver"oc3et1 asociado a n n,mero de perto específico$ @ Esta!lecer n tiempo de espera m"ximo para el soc/et$ ? Crear n !cle infinito4 ?$& In+ocar el m7todo accept!& del soc/et ser+idor$ Este m7todo se -eda esperando (asta reci!ir la petición de conexión de n cliente$ En canto se esta!lece la conexión con el cliente1 de+el+e n ne+o soc/et -e se tili)ar" para la comnicación con ese cliente$
?$@ ?$? ?$> ?$
%reparar los fl#os de entrada ' salida1 a partir del ne+o soc/et$ Reci!ir el mensa#e del ser+idor$ En+iar el mensa#e de eco de +elta al cliente$ Cerrar los fl#os ' la conexión del soc/et creado en el m7todo accept!&$
A continación se mestra el psedoJcódi2o del ser+idor mono(ilo4 import java.net.*; import java.io.*;
/** Ejemplo que implementa un servidor de eco usando 7CP. */ public class "ervidor7CP public static void main!"trin# ar#v$%& if !ar#v.len#t' () 1& "+stem.err.println!,-ormato "ervidor7CP ,&; "+stem.eit!01&; 2 try // Creamos el soc3et del servidor // Esta5lecemos un timeout de 6 se#s while !true& // Esperamos posi5les coneiones // Esta5lecemos el canal de entrada // Esta5lecemos el canal de salida // Beci5imos el mensaje del cliente // Enviamos el eco al cliente // Cerramos los lujos 2 2 catch !"oc3et7imeoutEception e& "+stem.err.println!,6 se#s sin reci5ir nada,&; 2 catch !Eception e& "+stem.err.println!,Error , @ e.#etessa#e!&&; e.print"tac37race!&; 2 finally //Cerramos el soc3et 2 2 2
Una +e) finali)ado el ser+idor mono(ilo de eco TC%1 para compro!ar -e fnciona correctamente de!er"s e#ectar en n terminal el ser+idor4 java "ervidor7CP 666
El ser+idor se -edar" esperando a -e los clientes le en+íen peticiones$ En otro terminal1 de!er"s e#ectar el cliente TC%4 java Cliente7CP local'ost 666 FPro5ando mi servidor 7CPG
El resltado de!ería ser -e el ser+idor reci!iese el mensa#e del cliente ' se lo reen+iase1 mientras -e el cliente de!ería reci!ir la respesta del ser+idor$ %ara con+ertir el ser+idor mono(ilo en mlti(ilo es necesario crear na clase ne+a 57'read"ervidor6 -e extienda la clase 7'read$ Esta clase ser" la -e se encar2e de atender na conexión con n cliente$ A(ora1 los pasos en el ser+idor TC% serían los si2ientes4
& Crear n "erver"oc3et1 asociado a n n,mero de perto específico$ @ Esta!lecer n tiempo de espera m"ximo para el soc/et$ ? Crear n !cle infinito4 ?$& In+ocar el m7todo accept!& del soc/et ser+idor$ Al esta!lecerse la conexión1 de+el+e n ne+o soc/et -e se tili)ar" para la comnicación con ese cliente$ ?$@ Crear n ne+o o!#eto 7'read"ervidor1 pasando como par"metro el ne+o soc/et de la conexión$ De esta manera1 la conexión es procesada con este ne+o soc/et en n (ilo de e#ección independiente1 -edando el soc/et ser+idor preparado para reci!ir ne+as peticiones de otros clientes$ ?$? Iniciar la e#ección del (ilo con el m7todo start!&$ Importante4 si se in+oca el m7todo run!& en l2ar del m7todo start!&1 se reali)a na e#ección secencial1 no mlti(ilo$ *os pasos en la clase 7'read"ervidor son los si2ientes 5m7todo run!&64 & %reparar los fl#os de entrada ' salida$ @ Reci!ir el mensa#e del ser+idor$ ? En+iar el mensa#e de eco de +elta al cliente$ > Cerrar los fl#os ' la conexión del soc/et creado en el m7todo accept!&$ A continación se mestra el psedoJcódi2o del ser+idor mlti(ilo4 import java.net.*;
/** Ejemplo que implementa un servidor de eco usando 7CP. */ public class "ervidor7CP public static void main!"trin# ar#v$%& if !ar#v.len#t' () 1& "+stem.err.println!,-ormato "ervidor7CP ,&; "+stem.eit!01&; 2 try // Creamos el soc3et del servidor // Esta5lecemos un timeout de 6 se#s while !true& // Esperamos posi5les coneiones // Creamos un o5jeto 7'read"ervidor pasándole la nueva conei4n // 9niciamos su ejecuci4n con el mItodo start!& 2 2 catch !"oc3et7imeoutEception e& "+stem.err.println!,6 se#s sin reci5ir nada,&; 2 catch !Eception e& "+stem.err.println!,Error , @ e.#etessa#e!&&; e.print"tac37race!&; 2 finally //Cerramos el soc3et del servidor 2
2 2
%sedoJcódi2o de la clase 7'read"ervidor4 import java.net.*; import java.io.*;
/** 7'read que atiende una conei4n de un servidor de eco. */ public class 7'read"ervidor extends 7'read
"oc3et soc3et; public 7'read"ervidor!"oc3et s& // :lmacenamos el soc3et de la conei4n 2 public void run!& try // Esta5lecemos el canal de entrada // Esta5lecemos el canal de salida // Beci5imos el mensaje del cliente // Enviamos el eco al cliente // Cerramos los lujos 2 catch !"oc3et7imeoutEception e& "+stem.err.println!,6 se#s sin reci5ir nada,&; 2 catch !Eception e& "+stem.err.println!,Error , @ e.#etessa#e!&&; 2 finally // Cerramos el soc3et 2 2 2
Una +e) finali)ado el ser+idor mlti(ilo de eco TC%1 para compro!ar -e fnciona correctamente de!er"s e#ectar en n terminal el ser+idor4 java "ervidor7CP 666
El ser+idor se -edar" esperando a -e los clientes le en+íen peticiones$ En otro terminal e#ecta n comando nc -e se conecte con el ser+idor1 ' d7#alo conectado4 nc local'ost 666
En otro terminal1 de!er"s e#ectar el cliente TC%4 java Cliente7CP local'ost 666 FPro5ando mi servidor 7CPG
En este caso1 el ser+idor lan)ar" n (ilo para atender la conexión reali)ada con el nc$ Al ser mlti(ilo1 lan)ar" otro (ilo de e#ección en paralelo para atender la petición reali)ada con el cliente de eco$ El resltado de!ería ser -e el ser+idor reci!iese el mensa#e del cliente ' se lo reen+iase1 mientras -e el cliente de!ería reci!ir la respesta del ser+idor$ %ara finali)ar la conexión del nc1 simplemente introdce al2o por teclado ' plsa ENTER4 esto en+iar" n mensa#e al ser+idor -e responder" con el eco ' cerrar" la conexión$
5.2. Preguntas TCP Una +e) -e (a'as implementado el ser+idor TC% mlti(ilo1 responde a las si2ientes pre2ntas4 &$ En la clase "ervidor7CP1
6. Lectura recomendada *esson4 All A!ot Soc/ets$ T(e 0a+a Ttorials$ Disponi!le en (ttp433#a+a$sn$com3docs3!oo/s3ttorial3netLor/in23soc/ets3