Sockets en JAVA
Sockets en JAVA
Sockets en JAVA
Contexto
Objetivos
Conocer las particularidades de las comunicaciones en Java Java, desarrollando pequeos programas que interacten con protocolos conocidos Conocer la perspectiva de servidor del paquete java de sockets
ndice
Introduccin a los sockets de servidor Conceptos bsicos Sockets servidor
clase ServerSocket
En cambio, un servidor
No conoce de antemano quien va a conectarse Ni cuando
Un servidor es como un telefonista, siempre est esperando a que lleguen llamadas entrantes
Comunicaciones: Socket, ServerSocket Pg. 3
En ambos casos, la funcionalidad del thread se implementa en el mtodo run. Veamos un ejemplo
Comunicaciones: Socket, ServerSocket Pg. 6
La clase ServerSocket
La clase Socket est en el paquete java.net
Proporciona soporte de TCP/IP Los constructores toman como parmetros:
El PUERTO consisten en un entero (int) entre 0-65535 Si la mquina donde se ejecuta el programa dispone de ms de un interfaz de red (ej. est conectada a la vez por cable y wifi), se puede especificar el interfaz que se debe usar para enviar/recibir datos (multihoming)
La clase ServerSocket
La clase ServerSocket nos ayuda a realizar el proceso de d conexin i
Instanciar ServerSocket Escuchar en el puerto (bind) ServerSocket escucha hasta que llega una conexin (accept) Cuando llega una conexin C g devuelve un objeto Socket
La clase ServerSocket
En java el constructor hace las tareas de configurar el ServerSocket y escuchar S S k t h en el puerto
Instanciar ServerSocket Escuchar en el puerto (bind)
La clase ServerSocket:Constructores
Java.net.ServerSocket
Constructor
publicServerSocket(intport)throwsBindException,IOException
Descripcin/Parmetros
Elconstructorcreaunsocketdeescucha(ServerSocket)enelpuerto indicado(creacin+bind).Sielparmetroes0javaseleccionar unpuertoaleatorio.Sielconstructorarrojaunaexcepcindetipo BindException (IOException)puedeserdebidoaqueelpuertoesten usooaquenotenemossuficientespermisos(puertosde0a1024)
Ejemplo
try{ ServerSocket servidorWeb =newServerSocket(80); } catch(IOException ex){ System.err.println(ex); } Comunicaciones: Socket, ServerSocket Pg. 13
La clase ServerSocket:Constructores
Escanear el PC p para ver los p puertos de escucha usados
package es.uc3m.it.gast.pervasive.teaching.networkComputing.ServerSockets.examples; import java.io.IOException; import java.net.ServerSocket; public class EscanerDeServidoresLocales { publicstaticvoidmain(String[]args){ /*compruebalospuertosdesdeel1al65535*/ ServerSocket test=null; for (int puerto=1;puerto<=65535;puerto++){ try{ //Sielservidorfallaenescucharenelpuertosignificaque //yahayunservidorendichopuerto // ya hay un servidor en dicho puerto test=newServerSocket(puerto); if (test!=null) test.close(); }catch(IOException ex){ System.out.println("Elpuerto"+puerto +"estocupadoporunservidor."); } } } } Comunicaciones: Socket, ServerSocket Pg. 14
La clase ServerSocket:Constructores
Java.net.ServerSocket
Constructor
publicServerSocket(intport,intqueueLength)throwsIOException, BindException
Descripcin/Parmetros
Elconstructorcreaunsocketdeescucha(ServerSocket)enelpuerto indicado.Sielparmetroes0javaseleccionarunpuerto aleatorio.Permiteindicarelnmerodeconexionesquesepueden guardarenlacola(sinaceptar)hastaqueelservidorcomienzaa rechazarconexiones.
Ejemplo
try{ ServerSocket glassfish =newServerSocket(4848,100); } catch(IOException ex){ System.err.println(ex); } Comunicaciones: Socket, ServerSocket Pg. 15
La clase ServerSocket:Constructores
MY HOST Network N k interface Ne Network k inte erface
Java.net.ServerSocket
Constructor
REMOTE HOST
publicServerSocket(intport,intqueueLength,InetAddressbindAddress) throwsBindException,IOException
Descripcin/Parmetros
Igualqueelanteriorperopermiteseleccionarelinterfazdered (direccinlocal)enelqueescuchar.Supongamosquetenemosvarias tarjetasdered,unawifi yotraethernet.
Ejemplo
try{ ServerSocket glassfish =newServerSocket(4848,100); } catch(IOException ex){ System.err.println(ex); } Comunicaciones: Socket, ServerSocket Pg. 16
La clase ServerSocket:Constructores
java.net.ServerSocket
Constructor
public ServerSocket()throws IOException publicvoidbind(SocketAddressendpoint)throws IOException publicvoidbind(SocketAddressendpoint,intqueueLength)throws IOException
Descripcin/Parmetros
Enestecaso,simplementecrealaclase.Habraquehacerbind manualmente(usandobind)paraqueescucharaenelpuerto.
Ejemplo
ServerSocket ss =newServerSocket(); //setsocketoptions... SocketAddress http=newInetSocketAddress(80); ss.bind(http);
La clase ServerSocket
El siguiente paso es esperar a una conexin y cuando ll d llegue aceptarla t l El mtodo accept es bloqueante, es decir, una vez se llama, el programa se detiene hasta que llega una conexin
Mtodo
publicSocketaccept()throwsIOException
Descripcin/Parmetros
Unavezelsocketestconfiguradoyescuchando(bind)elmtodoaccept bloqueaelflujodelprogramahastaquellegaunaconexin. Elmtodoaccept devuelveunsocketcuandorecibeunaconexin.A partirdeahsepuedellamaragetInputStream ygetOutputStream paraobtenerlosstreams decomunicacinconelcliente.
10
La clase ServerSocket
Cuando se acepta, obtiene un Socket se
11
Mtodos
publicInetAddressgetInetAddress() publicintgetLocalPort()
Descripcin/Parmetros
getInetAddress devuelveladireccinlocal(interfazdered)enlaque escuchaelservidor. getLocalPort devuelveelpuertoenelqueescuchaelservidor(util si sehasolicitadounpuertoaleatorio)
12
Mtodos avanzados
publicintgetSoTimeout()throws IOException publicbooleangetReuseAddress()throws SocketException publicintgetReceiveBufferSize()throwsSocketException
Descripcin/Parmetros
getSoTimeout devuelveelvalordelavariabledesistemaTCPSO_TIMEOUT quecorrespondealtiempoesperadoporaccept antesdedevolver java.io.InterruptedIOException.Porlogeneralesinfinito. getReuseAddress devuelve el true/false (variable de sistema TCP devuelveeltrue/false(variabledesistemaTCP SO_TIMEOUT) indicandosiladireccin/pruerto puedereutilizarsesi aunexistetrficoatravesandolared(delaantiguaconexinque usabaelpuerto) getReceiveBufferSize devuelveelvalordelavariabledesistemaTCP SO_RCVBUF quecorrespondealtamaodelbufferderecepcinasignado acadasoket devueltoporaccept.Dependedelaplataforma.
Comunicaciones: Socket, ServerSocket Pg. 25
13
Mtodo
publicvoidclose()throwsIOException
Descripcin/Parmetros
Cierraelsocketdeservidor(ServerSocket).Deestamaneraelservidor dejadeescucharenelpuerto. Nodebeconfundirseconcerrarelsocketdevueltoporaccept.
Ejemplo
ServerSocket server=newServerSocket(80); server.close();
Mtodos
publicvoidsetSoTimeout(inttimeout)throws SocketException publicvoidsetReuseAddress(booleanon)throwsSocketException public voidsetReceiveBufferSize(intsize)throwsSocketException
Descripcin/Parmetros
setSoTimeout asignaelvalordelavariabledesistemaTCPSO_TIMEOUT quecorrespondealtiempoesperadoporaccept antesdedevolver java.io.InterruptedIOException. setReuseAddress estableceelvalor(true/false)delavariablede sistemaTCPSO_TIMEOUT.Sielvalorestrue,ladireccin/pruerto i i i i puedereutilizarseaunenpresenciadetrficodelaantigua conexinqueusabaelpuerto. setReceiveBufferSize configuraeltamaodelbufferderecepcindel socketdevueltoporaccept.CorrespondealavariabledesistemaTCP SO_RCVBUF.
Comunicaciones: Socket, ServerSocket Pg. 27
14
15