"Ciao, Amico!"

"Ciao Rishi!"

"L'argomento della lezione di oggi sono le prese".

"Sai già che ogni computer della rete ha il proprio indirizzo IP univoco."

"Sì."

"Ora immagina di avere diversi computer, ognuno dei quali esegue una dozzina di programmi che accedono a Internet: Skype, ICQ, ecc."

"E questi programmi vogliono comunicare tra loro."

"Dobbiamo impedire loro di interferire l'uno con l'altro. Dobbiamo fare in modo che Skype si connetta con Skype, Slack si connetta con Slack, ecc."

"Ricordi come è stato risolto questo problema con URL e server web?"

"Sì, abbiamo aggiunto le porte."

"Esattamente."

"È proprio come fare un mucchio di piccole stanze in una casa e dire che la casa è un condominio. Ogni porta è come un appartamento separato. "

"Se un indirizzo IP è un identificatore univoco per un computer, allora un indirizzo IP combinato con una porta è un identificatore univoco per un certo 'appartamento' nel computer, dove può risiedere un programma. "

"Questa posizione univoca si chiama presa ."

"Un socket ha il proprio numero univoco che consiste in un indirizzo IP e un numero di porta. "

"Ah. In altre parole, un socket è un identificatore per una posizione di un computer virtuale in cui può risiedere un programma? E un altro programma invia messaggi a questa posizione, che consente ai due programmi di comunicare?"

"Non so come l'hai capito, ma è proprio così."

"Me l'ha detto il mio senso robotico."

"Fantastico. Allora lascia che ti fornisca alcuni dettagli."

"I socket sono in realtà il modo più semplice e primitivo per comunicare tra i programmi."

"Java ha due classi per lavorare con i socket. Sono Socket e ServerSocket ."

" ServerSocket è una classe speciale i cui oggetti rappresentano il server, cioè mi permettono di servire le richieste che arrivano su un particolare socket."

"La classe Socket è in realtà un socket client. La usiamo per inviare messaggi a un altro socket e ricevere le risposte."

"Ecco come inviare un messaggio a un socket:"

Esempio
// 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();

"È tutto molto simile al download di un file da Internet."

"Questo, ragazzo mio, è perché anche lì si usano le prese."

"I socket sono al centro di tutto ciò che è associato a una rete, beh, quasi tutto."

"Puoi leggere ulteriori informazioni qui "

"Grazie per la lezione, Rishi."

"Non ho ancora finito. Questo è un pio desiderio."

"Ora esploreremo come funziona un socket per server."

"È un po' più complicato."

Esempio
// 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();
}

"Voglio attirare la tua attenzione su un paio di punti."

"Punto 1: per creare un socket (client), è necessario specificare un indirizzo IP (o nome di dominio) e una porta. Per creare un socket server, è sufficiente specificare una porta. Il socket server esiste solo sul computer in cui è stato creato."

"Punto 2: la classe ServerSocket ha un metodo accept() che attende una connessione in entrata. In altre parole, il metodo verrà eseguito per sempre finché un socket client non tenterà di connettersi. Quindi il metodo accept() accetta la connessione, crea un socket oggetto per consentire la comunicazione, quindi restituisce questo oggetto."

"Dal punto di vista di un programmatore Java, un socket è costituito da due flussi: un InputStream da cui leggi messaggi/dati e un OutputStream in cui scrivi messaggi/dati."

"Quando crei un socket server, in realtà stai creando una porta a cui possono connettersi i socket client su altri computer. Ma per fare ciò, devono specificare correttamente il numero di porta del nostro socket e l'indirizzo IP del nostro computer. Bene, o il suo nome di dominio."

"Ecco un esempio interessante per te. Puoi provare a scavarci dentro ed eseguirlo:"

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

"Il punto centrale è utilizzare un socket del server per scrivere un server Web super primitivo a cui è possibile accedere semplicemente da un browser."

"Wow! Un web server? Fantastico! Lo studierò molto attentamente."

"Grazie, Rishi."

"Questo è tutto, Amigo. Vai a rilassarti!"