[go: up one dir, main page]

0% encontró este documento útil (0 votos)
72 vistas7 páginas

Comunicación Cliente/Servidor en Java

1) La clase Socket en Java permite la comunicación a través de la red a un nivel más bajo mediante sockets de cliente y servidor. 2) Los sockets proporcionan canales de comunicación confiables entre aplicaciones cliente y servidor a través de TCP/IP. 3) Los sockets asocian flujos de entrada y salida a conexiones entre clientes y un servidor escuchando en un puerto.

Cargado por

rramos_668314
Derechos de autor
© © All Rights Reserved
Nos tomamos en serio los derechos de los contenidos. Si sospechas que se trata de tu contenido, reclámalo aquí.
Formatos disponibles
Descarga como DOCX, PDF, TXT o lee en línea desde Scribd
0% encontró este documento útil (0 votos)
72 vistas7 páginas

Comunicación Cliente/Servidor en Java

1) La clase Socket en Java permite la comunicación a través de la red a un nivel más bajo mediante sockets de cliente y servidor. 2) Los sockets proporcionan canales de comunicación confiables entre aplicaciones cliente y servidor a través de TCP/IP. 3) Los sockets asocian flujos de entrada y salida a conexiones entre clientes y un servidor escuchando en un puerto.

Cargado por

rramos_668314
Derechos de autor
© © All Rights Reserved
Nos tomamos en serio los derechos de los contenidos. Si sospechas que se trata de tu contenido, reclámalo aquí.
Formatos disponibles
Descarga como DOCX, PDF, TXT o lee en línea desde Scribd
Está en la página 1/ 7

CLASE SOCKET EN JAVA

Algunas veces, los programas requieren una comunicación a través de la red, a un


nivel un poco más bajo; por ejemplo, cuando se desea escribir una aplicación cliente
/ servidor. Para este tipo de programas, se utilizan las clases Socket y ServerSocket,
del paquete java.net.

La comunicación entre cliente y servidor debe ser confiable; esto quiere decir que
no se pueden perder datos, y que éstos deben llegar al cliente en el mismo orden
en el cual fueron enviados por el servidor; por esta razón se utiliza TCP/IP.

TCP proporciona un canal de comunicación confiable, punto a punto, que las


aplicaciones cliente / servidor utilizan para comunicarse entre ellas a través de
Internet. Para comunicarse a través de TCP, se establece una conexión entre el
programa cliente y el programa servidor. Cada programa enlaza un socket en su
extremo de la conexión. Para comunicarse, cliente y servidor leen y escriben hacia
el socket asociado a la conexión.

Cuando se escribe la parte del programa correspondiente al servidor, se abre un


conector (socket), normalmente utilizando un número de puerto conocido, y se
espera a que se conecte algún cliente. El cliente llama desde algún número de
puerto no utilizado (conocido como puerto efímero). En cuanto se conectan el cliente
y el servidor, es corriente que éste último proponga que la conversación continúe
en un puerto diferente. Este diseño deja libre el número de puerto conocido, para
manejar una nueva conexión.

Una vez conectados el cliente y el servidor, hay un protocolo de más alto nivel que
es dependiente del puerto que se esté utilizando. TCP/IP reserva los primeros 1024
puertos para sus protocolos específicos.

En TCP/IP, el puerto 21 es para FTP, el 23 para Telnet, el 25 para e-mail, el 79 para finger, el 80
para HTTP, el 119 para netnews. Cada protocolo debe determinar cómo debe dialogar un cliente
con el puerto.
¿Qué es un Socket?

Un socket es un conector de red.

Un conector de red es similar a un conector eléctrico. Hay distintos enchufes en la red


eléctrica que tienen una forma estándar de entregar la energía. Cualquier cosa que entienda
el protocolo estándar puede enchufarse al conector y enviar información. En los enchufes
eléctricos no importa si se conecta una lámpara o un tostador, ya que siempre que trabajen
con el voltaje adecuado, ambos funcionarán correctamente.

Pensemos cómo se crea la factura del servicio de energía eléctrica: En algún lugar entre su
casa y la red eléctrica hay un contador. Cada kilovatio que pasa a través del contador se
queda registrado y periódicamente la factura llega a nuestra “dirección”. Por eso, aunque
la electricidad fluya libremente a través de la red, todos los conectores de la casa tienen
una dirección particular. De la misma forma funcionan los conectores de la red, excepto en
que en lugar de electrones y de calles se trabaja con paquetes TCP/IP y direcciones IP.

La noción de conector permite a un único computador atender a diferentes clientes a la vez,


además de proporcionar diferentes tipos de información. Esto se consigue utilizando lo que
se conoce como puerto, que es un conector numerado en una máquina particular. Se dice
que un proceso servidor "escucha” en un puerto hasta que un cliente se conecta a él. Un
servidor puede aceptar múltiples clientes conectados todos ellos por el mismo número de
puerto, aunque cada sesión es única. Para gestionar las conexiones de varios clientes, el
proceso servidor debe ser un proceso multihilo o disponer de otros mecanismo para
manejar las E/S simultáneas.

Normalmente, un servidor se ejecuta en un computador específico y tiene un socket


enlazado a un número específico de puerto. El servidor sólo espera, escuchando en el
socket, hasta que el cliente realice una solicitud de conexión.

En el lado del cliente: El cliente conoce el nombre de host de la máquina en la cual se está
ejecutando el servidor, y el número de puerto en el cual se encuentra conectado el servidor.
Para realizar la solicitud de conexión, el cliente trata de “reunirse” con el servidor utilizando
el nombre del computador donde esté se está ejecutando y el número de puerto.

En el lado del cliente: El cliente conoce el nombre de host de la máquina en la cual se está
ejecutando el servidor, y el número de puerto en el cual se encuentra conectado el servidor.
Para realizar la solicitud de conexión, el cliente trata de “reunirse” con el servidor utilizando
el nombre del computador donde esté se está ejecutando y el número de puerto.

En el lado del cliente, si la conexión es aceptada, se crea un socket, que puede ser utilizado
para comunicarse con el servidor. El socket en el lado del cliente no se enlaza al número de
puerto utilizado para establecer la conexión con el servidor. En lugar de esto, al cliente se
le asigna un número de puerto local, en la máquina en la cual se está ejecutando.

Ahora el cliente y el servidor pueden comunicarse, escribiendo o leyendo en sus respectivos


sockets.

Java proporciona dos tipos de sockets: los de cliente, implementados en la clase Socket, y
los de servidor, implementados en la clase ServerSocket.

· La clase Socket esconde los detalles de implementación de cualquier sistema, al


programa Java. Utilizando la clase java.net.Socket los programas Java se pueden comunicar
a través de la red, en una forma independiente de la plataforma. La clase Socket está
diseñada para conectarse a un servidor y es la que inicia el protocolo de intercambio.

· La clase ServerSocket, implementa un socket que el servidor puede utilizar para


escuchar y aceptar las conexiones con los clientes. La clase ServerSocket está diseñada para
“escuchar” y esperar hasta que los clientes se conecten, para inmediatamente después
empezar a prestarles el servicio solicitado.
Clase Socket (Conectores TCP/IP para clientes)

Para conectarse a un host, el programa cliente tiene que incluir una línea como:

Socket conexión = new Socket (hostname, portNumber);


Si se presenta algún problema, el constructor Socket lanza una IOException. De lo
contrario, se puede suponer que el Socket está abierto y preparado para la comunicación:
BufferedReader lector = new BufferedReader ( new InputStreamReader
(conexión.getInputStream()));
BufferedWriter escritor = new BufferedWriter ( new OutputStreamWriter
(conexión.getOutputStream()));
Ahora se puede leer y escribir utilizando los flujos lector y escritor de la forma habitual.
Al finalizar el intercambio de datos, debe ejecutarse la instrucción:
conexión.close();

La cual cierra la conexión y a la vez cierra todos los streams, readers y writers asociados a
este Socket.

La construcción de un socket se realiza de la siguiente manera (veremos


varios constructores):

 Socket s=new Socket(): Crea un Socket por defecto y no conectado.

 Socket s=new Socket(InetAdrees direccion, int puerto): Crea y conecta


un Socket a la IP especificada y el puerto especificado.

 Socket s=new Socket(String host, int puerto); Crea y conecta


un Socket al host y al puerto especificados.

Los métodos más usados por esta clase son:

 void close(): Método que cierra el Socket.


 s.close();

 InetAddres getInetAddress(): método que retorna la IP a la cual esta


conectado el socket.

 s.getInetAddress();

 InputStream getInputStream(): Método que nos devuelve un flujo de datos


de entrada para el socket.

 s.getInputStream();

 OutputStream getOutputStream(): Método que devuelve un flujo de datos


de salida para el socket.

 s.getoutputStream();

 int getPort(): Método que devuelve el puerto remoto al que esta


conectado el socket.

 s.getPort();

 boolean isClosed(): Método que devuelve true si el socket está cerrado y


false si no lo está.

 s.isClosed();

 boolean isConnected(): Método que devuelve true si el socket está


conectado y false si no lo está.

 s.isConnected();

 void shutdownInput(): Método que cierra el flujo de entrada del socket.

 s.shutdownInput();

 void shutdownoutput(): Método que cierra el flujo de salida del socket.

 s.shutdownOutput();
 boolean isInputShutdown(): Método que devuelve true si el flujo de
entrada está cerrado y false si no lo está.

 s.isinputShutdown();

 boolean isOutputShutdown(): Método que devuelve true si el flujo de


salida está cerrado y false si no lo está.

 s.isOutputShutdown():

La clase ServerSocket

La clase ServerSocket es la que se utiliza a la hora de crear servidores, al igual que como se
ha visto, la clase Socket se utilizaba para crear clientes.

Se construye de la siguiente manera:

 ServerSocket ss=new ServerSocket(): Constructor que crea


un ServerSocket sin estar unido a nada.
 ServerSocket ss=new ServerSocket(int puerto): Constructor que crea
un ServerSocket a la escucha del puerto indicado.
Los métodos que utiliza son los mismos que puede llegar a utilizar Socket a excepción de
unos pocos, entre ellos el siguiente:
 Socket accept(): Método que acepta las conexiones entrantes en el servidor
montado por ServerSocket.
 Socket s=ss.accept();

Teniendo estas 2 clases, el funcionamiento genérico sería:


1. Tenemos un programa de escucha en un servidor y otro en un cliente.
2. El servidor tiene un ServerSocket asociado a un socket con un puerto de escucha y
está a la espera de una conexión.
3. El cliente posee un socket con el "host" del equipo al que quiere mandar un
proceso y el número de puerto al que está asociado dicho equipo.
4. El servidor acepta la conexión entrante del cliente y realizan el intercambio de
información.
5. Una vez se termina el intercambio de información se cierran todos los canales
y ServerSocket vuelve a quedar a la escucha de posibles conexiones.

¿Qué es un búfer en Java?

Un búfer es una parte de la memoria que se utiliza para almacenar un flujo de datos
desde dispositivos periféricos. Luego, desde este búfer, este flujo de datos se recopila y
almacena en variables. Un flujo puede definirse como un flujo continuo de datos. El búfer
es bastante útil ya que Java trata todo como una cadena.

Pero cuando usamos un búfer, lo que sucede es que cada carácter se almacena en el búfer
primero uno por uno en ubicaciones de memoria consecutivas, convirtiendo así el flujo de
datos en un solo valor sólido. Entonces, cuando escanea valores
utilizando BufferedReader , lo que hace es que primero almacena el valor en un búfer,
luego, utilizando el método readLine () , toma todo el valor del búfer y lo almacena en la
variable. El método readLine () almacena el valor tan pronto
como pulsamos la tecla Intro desde nuestro teclado.

Es por eso que realmente


necesitamos InputStreamReader . El InputStreamReader almacena el flujo de datos
entrante en el búfer y luego, utilizando BufferedReader , se almacena en la variable.

En la declaración BufferedReader br = new BufferedReader (new InputStreamReader


( System.in ));

BufferedReader realiza la tarea de tomar los datos del búfer y almacenarlos en la


variable. El InputStreamReader realiza la tarea de almacenar el flujo de datos entrante en
el búfer y System.in se refiere al teclado. Indica que el teclado es la fuente de flujo de
datos entrante.

También podría gustarte