Los
sockets (zócalos, referido a los enchufes de conexión de cables) son mecanismos de comunicación entre programas a través de una red TCP/IP. De hecho, al establecer una conexión via Internet estamos utilizando sockets: los sockets realizan la interfase entre la aplicación y el protocolo TCP/IP.
Dichos mecanismos pueden tener lugar dentro de la misma máquina o a través de una red. Se usan en forma cliente-servidor: cuando un cliente y un servidor establecen una conexión, lo hacen a través de un socket. Java proporciona para esto las clases ServerSocket y Socket.
Los sockets tienen asociado un
port (puerto). En general, las conexiones via internet pueden establecer un puerto particular (por ejemplo, en
http://www.rockar.com.ar**:80**/index.html∞ el puerto es el 80). Esto casi nunca se especifica porque ya hay definidos puertos por defecto para distintos protocolos: 20 para ftp-data, 21 para ftp, 79 para finger, etc. Algunos servers pueden definir otros puertos, e inclusive pueden utilizarse puertos disponibles para establecer conexiones especiales.
Justamente, una de las formas de crear un objeto de la clase URL permite especificar también el puerto:
URL url3 = new URL ("http", "www.rockar.com.ar", 80,"sbits.htm");
Para establecer una conexión a través de un socket, tenemos que programar por un lado el servidor y por otro los clientes.
En el servidor, creamos un objeto de la clase ServerSocket y luego esperamos algún cliente (de clase Socket) mediante el método accept():
ServerSocket conexion = new ServerSocket(5000);
5000 es el puerto en este caso
Socket cliente = conexion.accept(); espero al cliente
Desde el punto de vista del cliente, necesitamos un Socket al que le indiquemos la dirección del servidor y el número de puerto a usar:
Socket conexion = new Socket ( direccion, 5000 );
Una vez establecida la conexión, podemos intercambiar datos usando streams como en el ejemplo anterior. Como la clase URLConnection, la clase Socket dispone de métodos getInputStream y getOutputStream que nos dan respectivamente un InputStream y un OutputStream a través de los cuales transferir los datos.