Socket.

Los sockets son los medios para establecer un vínculo de comunicación entre maquinas en la red. Ofrece cuatro tipos de socket:

Socket: es un cliente del api TCP y se usa por lo general para conectarse un host remoto.

ServerSocket: es un servidor del api TCP y se usa por lo general para aceptar conexiones de los clientes.

DatagramSocket: es usado para el envío y recepción de paquetes o datagramas por medio de UDP.

MulticastSocket: es una subclase de DatagramSocket usado cuando hay grupos de multidifusión.

Api de alto nivel.

Existen un numero de clases en el paquete java.net que proporcionan una alto de abstracción lo cual permite el fácil acceso a recursos de red:

URI: Proporciona solamente el identificador y no los medios para acceder al recurso.

URL: Proporciona el identificado y el medio para acceder al recurso.

URLCOnnection: es creado a partir de URL y es el enlace de comunicación utilizado para acceder a los recursos apuntados por la URL. Esta clase delega la mayor parte del trabajo a protocolos http o FTP.

HttpURLConnection: es una subclase de URLConnection y proporciona métodos adicionales específicos para el protocolo http.

Manejadores de protocolos.

Existen librerías externas que proporcionan ciertas herramientas concretas para aumentar la fiabilidad y velocidad al escribir programas:

Jexxus (Java Nexus): encapsula la API del socket, reduciendo redundancia a la hora de escribir código de red haciendo más fácil la creación de aplicaciones en red.

Para conectar un cliente al servidor:

Socket, tipos y características.

Se puede definir socket como un enlace entre dos computadoras que están ejecutando un programa en red.

Socket Orientados a la conexión.

Para ello Java nos proporciona dos clases: Socket y ServerSocket.

La clase ServerSocket implementa un socket servidor, que espera peticiones entrantes de la red. Procesa la petición y si es necesario devuelve la información al cliente que la ha solicitado.

Algunos de sus métodos son:

accept(): escucha las peticiones que son hechas y las acepta.

bind(SocketAddress endpoint): enlaza el ServerSocket a una dirección especifica.

close(): cierra el socket.

getLocalPort(): indica el número de puerto por el que el ServerSocket esta escuchando peticiones.

Socket no orientado a petición.

Cuando no sea necesario que el canal sea fiable, java nos proporciona la clase DatagramaSocket para el envío y recepción de paquetes datagrama. Múltiples paquetes son enviados de una maquina a otra pudiendo ser enrutados de manera diferentes y llegado en cualquier orden.

Algunos métodos son:

close(): cierra el DatagramSocket.

bind(SocketAddress addr):enlaza el DatagramSocket a una dirección especifica.

disconnet(): se desconecta el socket-

send(DatagramPacket p): envía un paquete desde el socket.

receive(DatagramPacket p): recibe un paquete.

Creación de Socket.

Los parámetros que se indican en el constructor son la máquina que tienen que ser la dirección del host a conectarse y el puerto al que se quiere conectar.

Creación de un ServerSocket.

Cuando queremos crear una aplicación cliente-servidor, en el caso del servidor necesitamos utilizar un ServerSocket.

Creación de un DatagramSocket.

Con la creación de este tipo de Socket, recordamos que se crea un socket UDP y no TCP como en los dos casos anteriores.

Enlazado y establecimiento de conexiones.

Una vez creados los socket en las aplicaciones que se están desarrollando se debe enlazar los socket de diferentes aplicaciones. Una parte del enlace ya se realiza a la hora de crear el socket puesto que dependiendo del tipo de socket visto se les pasa sus constructores el puerto o la dirección de conexión.

Para que se complete el enlazado y para que la conexión se establezca por completo, el servidor debe aceptar las peticiones que recibe desde el cliente. Para ello se utiliza el método accept().

Para el socket de tipo DatagramSocket, en la parte del cliente simplemente con declarar el socket y utilizar los métodos receive y send, para recibir y enviar información al servidor. Cuando se crea un Socket de este tipo en la parte cliente, no es necesario especificar ninguna dirección del servidor, puesto que será en los paquetes que se envían donde se indicara la dirección.