"Olá, amigo!"

"Olá, Rishi!"

"O tópico da lição de hoje são soquetes."

"Você já sabe que cada computador na rede tem seu próprio endereço IP exclusivo."

"Sim."

"Agora imagine que você tem vários computadores, cada um rodando uma dúzia de programas que acessam a Internet: Skype, ICQ, etc."

"E esses programas querem se comunicar uns com os outros."

"Precisamos impedir que eles interfiram uns nos outros. Precisamos fazer com que o Skype se conecte ao Skype, o Slack se conecte ao Slack etc."

"Lembra como esse problema foi resolvido com URLs e servidores web?"

"Sim, adicionamos portas."

"Exatamente."

"É como criar vários cômodos pequenos em uma casa e dizer que a casa é um prédio de apartamentos. Cada porta é como um apartamento separado. "

"Se um endereço IP é um identificador exclusivo para um computador, então um endereço IP combinado com uma porta é um identificador exclusivo para um determinado 'apartamento' no computador, onde um programa pode residir. "

"Esse local exclusivo é chamado de soquete ."

"Um soquete tem seu próprio número exclusivo que consiste em um endereço IP e um número de porta. "

"Ah. Em outras palavras, um soquete é um identificador para algum local de computador virtual onde um programa pode residir? E outro programa envia mensagens para esse local, o que permite que os dois programas se comuniquem?"

"Eu não sei como você entendeu isso, mas está exatamente certo."

"Meu senso robótico me disse."

"Ótimo. Então deixe-me dar alguns detalhes."

"Sockets são, na verdade, a maneira mais básica e primitiva de os programas se comunicarem."

"Java tem duas classes para trabalhar com soquetes. Elas são Socket e ServerSocket ."

" ServerSocket é uma classe especial cujos objetos representam o servidor, ou seja, eles me permitem atender solicitações que chegam em um soquete específico."

"A classe Socket é na verdade um soquete do cliente. Nós a usamos para enviar mensagens para outro soquete e receber as respostas."

"Veja como enviar uma mensagem para um soquete:"

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

"É tudo muito semelhante a baixar um arquivo da Internet."

"Isso, meu rapaz, é porque lá também se usam soquetes."

"Os soquetes estão no centro de tudo associado a uma rede - bem, quase tudo."

"Você pode ler informações adicionais aqui "

"Obrigado pela lição, Rishi."

"Ainda não terminei. Isso é uma ilusão."

"Agora vamos explorar como funciona um soquete de servidor."

"É um pouco mais complicado."

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

"Quero chamar sua atenção para alguns pontos."

"Ponto 1: Para criar um soquete (cliente), você precisa especificar um endereço IP (ou nome de domínio) e uma porta. Para criar um soquete de servidor, você só precisa especificar uma porta. O soquete do servidor só existe no computador onde foi criado."

"Ponto 2: A classe ServerSocket tem um método accept() que espera por uma conexão de entrada. Em outras palavras, o método será executado indefinidamente até que algum soquete do cliente tente se conectar. Em seguida, o método accept() aceita a conexão, cria um soquete objeto para permitir a comunicação e, em seguida, retorna esse objeto."

"Do ponto de vista de um programador Java, um soquete é dois fluxos: um InputStream do qual você lê mensagens/dados e um OutputStream no qual você escreve mensagens/dados."

"Quando você cria um soquete de servidor, na verdade está criando uma porta à qual os soquetes de cliente em outros computadores podem se conectar. Mas, para fazer isso, eles devem especificar corretamente o número da porta de nosso soquete e o endereço IP de nosso computador. Bem, ou seu nome de domínio."

"Aqui está um exemplo interessante para você. Você pode tentar investigá-lo e executá-lo:"

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

"O ponto principal é usar um soquete de servidor para escrever um servidor web super primitivo que você pode acessar simplesmente de um navegador."

"Uau! Um servidor web? Legal! Vou estudar com muito cuidado."

"Obrigado, Rishi."

"Isso é tudo, amigo. Vá relaxar!"