„Здрасти, Амиго!“

„Здравей, Риши!“

„Темата на днешния урок е гнездата.“

„Вече знаете, че всеки компютър в мрежата има свой уникален IP address.“

— Да.

„Сега си представете, че имате няколко компютъра, всеки от които работи с дузина програми за достъп до интернет: Skype, ICQ и т.н.“

„И тези програми искат да комуникират помежду си.“

„Трябва да ги спрем да си пречат един на друг. Трябва да направим така, че Skype да се свързва със Skype, Slack да се свързва със Slack и т.н.“

„Помните ли How този проблем беше решен с URL addressи и уеб сървъри?“

„Да, добавихме портове.“

"Точно."

"Това е точно като да направите куп малки стаи в къща и да кажете, че къщата е жorщна сграда. Всеки порт е като отделен апартамент. "

„Ако един IP address е уникален идентификатор за компютър, тогава IP address, комбиниран с порт, е уникален идентификатор за определен „апартамент“ в компютъра, където може да се намира програма .

„Това уникално местоположение се нарича гнездо .“

„Сокетът има свой собствен уникален номер, който се състои от IP address и номер на порт.

"Ах. С други думи, сокетът е идентификатор за няHowво местоположение на виртуален компютър, където може да се намира програма? И друга програма изпраща съобщения до това местоположение, което позволява на двете програми да комуникират?"

— Не знам How го разбра, но е точно така.

— Моето робо-чувство ми каза.

„Страхотно. Тогава позволете ми да ви дам някои подробности.“

„Сокетите всъщност са най-основният и примитивен начин за комуникация между програмите.“

"Java има два класа за работа със сокети. Те са Socket и ServerSocket ."

" ServerSocket е специален клас, чиито обекти представляват сървъра, т.е. те ми позволяват заявки за обслужване, които пристигат на определен сокет."

" Класът Socket всъщност е клиентски сокет. Използваме го, за да изпращаме съобщения до друг сокет и да получаваме отговорите."

„Ето How да изпратите съобщение до сокет:“

Пример
// 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();

„Всичко много прorча на изтегляне на файл от интернет.

— Това е, момчето ми, защото и там се използват контакти.

„Сокетите лежат в основата на всичко, свързано с мрежа – е, почти всичко.“

„Можете да прочетете допълнителна информация тук

„Благодаря за урока, Риши.“

„Още не съм свършил. Това е пожелателно мислене.“

„Сега ще проучим How работи сървърният сокет.“

— Малко по-сложно е.

Пример
// 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();
}

— Искам да насоча вниманието ви към няколко точки.

"Точка 1: За да създадете (клиентски) сокет, трябва да посочите IP address (or име на домейн) и порт. За да създадете сървърен сокет, трябва само да посочите порт. Сървърният сокет съществува само на компютъра, където то е създадено."

"Точка 2: Класът ServerSocket има метод accept(), който чака входяща връзка. С други думи, методът ще работи вечно, докато някой клиентски сокет не се опита да се свърже. Тогава методът accept() приема връзката, създава сокет обект, за да позволи комуникация, и след това връща този обект."

„От гледна точка на Java програмист, сокетът представлява два потока: InputStream, от който четете съобщения/данни, и OutputStream, в който пишете съобщения/данни.“

„Когато създавате сървърен сокет, вие всъщност правите порт, към който клиентските сокетите на други компютри могат да се свързват. Но за да направят това, те трябва правилно да посочат номера на порта на нашия сокет и IP address на нашия компютър. Е, or неговото име на домейн."

„Ето един интересен пример за вас. Можете да опитате да се разровите в него и да го стартирате:“

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

„Целият смисъл е да се използва сървърен сокет, за да се напише супер примитивен уеб сървър, до който можете да получите достъп просто от браузър.“

"Уау! Уеб сървър? Страхотно! Ще го проуча много внимателно."

— Благодаря ти, Риши.

"Това е всичко, Амиго. Върви да се отпуснеш!"