"¡Hola, amigo!"

"¡Hola, Rishi!"

"El tema de la lección de hoy son los enchufes".

"Ya sabes que cada computadora en la red tiene su propia dirección IP única".

"Sí."

"Ahora imagine que tiene varias computadoras, cada una con una docena de programas que acceden a Internet: Skype, ICQ, etc."

"Y estos programas quieren comunicarse entre sí".

"Necesitamos evitar que interfieran entre sí. Necesitamos que Skype se conecte con Skype, Slack se conecte con Slack, etc".

"¿Recuerdas cómo se resolvió este problema con las URL y los servidores web?"

"Sí, agregamos puertos".

"Exactamente."

"Es como hacer un montón de habitaciones pequeñas en una casa y decir que la casa es un edificio de apartamentos. Cada puerto es como un apartamento separado " .

"Si una dirección IP es un identificador único para una computadora, entonces una dirección IP combinada con un puerto es un identificador único para un determinado 'apartamento' en la computadora, donde puede residir un programa " .

"Esta ubicación única se llama socket ".

"Un socket tiene su propio número único que consta de una dirección IP y un número de puerto " .

"Ah. En otras palabras, un socket es un identificador de alguna ubicación de computadora virtual donde puede residir un programa. ¿Y otro programa envía mensajes a esta ubicación, lo que permite que los dos programas se comuniquen?"

"No sé cómo entendiste eso, pero eso es exactamente correcto".

"Mi sentido robótico me lo dijo".

"Genial. Entonces déjame darte algunos detalles".

"Los sockets son en realidad la forma más básica y primitiva para que los programas se comuniquen".

"Java tiene dos clases para trabajar con sockets. Son Socket y ServerSocket ".

" ServerSocket es una clase especial cuyos objetos representan el servidor, es decir, me permiten atender las solicitudes que llegan a un socket en particular".

"La clase Socket es en realidad un socket de cliente. Lo usamos para enviar mensajes a otro socket y recibir las respuestas".

"Aquí se explica cómo enviar un mensaje a un socket:"

Ejemplo
// Create a socket
Socket clientSocket = new Socket("localhost", 4444);

// Get an OutputStream
OutputStream outputStream = clientSocket.getOutputStream();
PrintWriter out = new PrintWriter(outputStream, true);
out.println("Kiss my shiny metal ass!");
out.flush();

// Read the response
InputStream inputStream = clientSocket.getInputStream();
BufferedReader in = new BufferedReader(new InputStreamReader(inputStream));
String answer = in.readLine();

"Todo es muy similar a descargar un archivo de Internet".

"Eso, muchacho, es porque allí también se usan enchufes".

"Los sockets se encuentran en el corazón de todo lo relacionado con una red, bueno, casi todo".

"Puedes leer información adicional aquí "

"Gracias por la lección, Rishi".

"Todavía no he terminado. Eso es una ilusión".

"Ahora exploraremos cómo funciona un socket de servidor".

"Es un poco más complicado".

Ejemplo
// Create a server socket object
ServerSocket serverSocket = new ServerSocket(4444); // Port

// Process incoming connections in a loop
while (true)
{
 // The accept method waits for someone to connect
 Socket socket = serverSocket.accept();

 // Read the response
 InputStream inputStream = socket.getInputStream();
 BufferedReader in = new BufferedReader(new InputStreamReader(inputStream));
 String message = in.readLine();

 // Create a response - we'll just reverse the string
 String reverseMessage = new StringBuilder(message).reverse().toString();

 // Send the response
 OutputStream outputStream = socket.getOutputStream();
 PrintWriter out = new PrintWriter(outputStream, true);
 out.println(reverseMessage);
 out.flush();
}

"Quiero llamar su atención sobre un par de puntos".

"Punto 1: Para crear un socket (cliente), debe especificar una dirección IP (o nombre de dominio) y un puerto. Para crear un socket de servidor, solo necesita especificar un puerto. El socket del servidor solo existe en la computadora donde fue creado."

"Punto 2: la clase ServerSocket tiene un método accept() que espera una conexión entrante. En otras palabras, el método se ejecutará para siempre hasta que algún socket cliente intente conectarse. Luego, el método accept() acepta la conexión, crea un socket objeto para permitir la comunicación, y luego devuelve este objeto".

"Desde el punto de vista de un programador de Java, un socket son dos flujos: un InputStream desde el que lee mensajes/datos y un OutputStream en el que escribe mensajes/datos".

"Cuando crea un socket de servidor, en realidad está creando un puerto al que se pueden conectar los sockets de clientes en otras computadoras. Pero para hacer esto, deben especificar correctamente el número de puerto de nuestro socket y la dirección IP de nuestra computadora. Bueno, o su nombre de dominio".

"Aquí hay un ejemplo interesante para ti. Puedes intentar profundizar en él y ejecutarlo:"

https://www.logicbig.com/tutorials/core-java-tutorial/http-server/http-server-basic.html

"El objetivo es usar un socket de servidor para escribir un servidor web súper primitivo al que pueda acceder simplemente desde un navegador".

"¡Guau! ¿Un servidor web? ¡Genial! Lo estudiaré con mucho cuidado".

"Gracias, Rishi".

"Eso es todo, Amigo. ¡Ve a relajarte!"