Sockets en Python

(43 comentarios)

La comunicación entre distintas entidades en una red se basa en Python en el clásico concepto de sockets. Los sockets son un concepto abstracto con el que se designa al punto final de una conexión.

Los programas utilizan sockets para comunicarse con otros programas, que pueden estar situados en computadoras distintas.

Un socket queda definido por la dirección IP de la máquina, el puerto en el que escucha, y el protocolo que utiliza.

[Pulsa para continuar]

Sockets en Java

(27 comentarios)

En Java las comunicaciones se basan en sockets con los que trabajamos a través de flujos de datos como si de E/S de archivos se tratara. Los sockets se clasifican en sockets de flujo o sockets de datagramas dependiendo de si el servicio utiliza TCP (orientado a conexión y fiable) o UDP.

En el modelo de sockets de flujo contamos con un objeto de tipo Socket en el cliente y en el servidor uno o más objetos Socket asociados a un ServerSocket. La E/S se realiza a través de objetos InputStream y OutputStream asociados a los Sockets.

El servidor crea un socket servidor que tiene como parámetro el puerto en el que a va estar escuchando las peticiones entrantes:
ServerSocket servicio = new ServerSocket(9999);

accept se mantiene a la espera de conexiones entrantes, bloqueando la ejecución. Cuando se establece una conexión se devuelve una instancia de Socket con la que llevar a cabo la comunicación.
Socket socketServicio = servicio.accept();

Los clientes crean objetos Socket para comunicarse con el servidor, por ejemplo localhost en el puerto 9999:
Socket cliente = new Socket("localhost", 9999);

Una vez iniciada la conexión, podemos usar getOutputStream y getInputStream para obtener los flujos de salida y entrada de datos de los sockets.
PrintWriter salida = new PrintWriter(socketServicio.getOutputStream(), true);
BufferedReader entrada = new BufferedReader(new InputStreamReader(cliente.getInputStream()));

Y utilizar los métodos de los flujos de datos para enviar o recibir información del otro lado de la conexión:
salida.println("Soy el servidor");
System.out.println("Recibido " + entrada.readLine());

Por último, una vez terminada la ejecución, tenemos que cerrar los flujos de datos y el socket (en ese orden):
salida.close();
socketServicio.close();

entrada.close();
cliente.close();

Un ejemplo típico para enseñar estos conceptos en la práctica es un servidor eco, cuyo código podéis descargar a continuación. Para probarlo podeis utilizar telnet para conectaros al puerto 9999 en localhost (telnet localhost 9999) y por cada cadena de texto enviada al servidor, este nos responderá con el mismo texto. Utiliza el comando ‘bye’ para terminar la conexión.

Descarga ServidorEco.java