Witaj Amigo!

- Cześć Risza!

— Tematem dzisiejszego wykładu są Gniazda. Gniazdo przetłumaczone z angielskiego - Rozeta.

Wiesz już, że każdy komputer w sieci ma swój unikalny adres IP.

- Tak.

— A teraz wyobraź sobie, że masz kilka komputerów, a na każdym z nich działa kilkanaście programów współpracujących z Internetem: Skype, ICQ itp.

A te programy chcą się ze sobą komunikować.

Konieczne jest upewnienie się, że nie „przeszkadzają” sobie nawzajem. Aby Skype komunikował się ze Skype, ICQ z ICQ itp.

Pamiętasz, jak ten problem został rozwiązany za pomocą adresów URL i serwerów WWW?

- Tak, dodano porty.

- Dokładnie.

To tak, jakby zrobić wiele małych pokoi w domu i zadeklarować, że jest to budynek mieszkalny. Każdy port jest jak osobne mieszkanie.

Tak więc adres IP to unikalny numer komputera, a  adres IP + port to unikalny numer określonego „mieszkania” (komórki) w komputerze, które może zajmować program.

Ta unikalna komórka nazywa się  gniazdem .

Gniazdo ma swój unikalny numer, który składa się z adresu IP i numeru portu.

- Tak. Te. socket - to numer jakiejś wirtualnej komórki w komputerze, którą może zająć program? A ten drugi program będzie wysyłał do niego wiadomości w tej komórce iw ten sposób będą się komunikować?

– Nie wiem, jak to wymyśliłeś, ale tak właśnie jest.

To jest moja robotyczna intuicja.

- Świetnie. W takim razie poznajmy szczegóły.

Gniazda są w rzeczywistości najbardziej podstawowym i prymitywnym sposobem komunikacji programów w sieciach.

Java ma dwie klasy do obsługi gniazd. Są to klasy  Socket  i  ServerSocket .

ServerSocket  to specjalna klasa, której obiekty pełnią rolę serwera – tj. Mogę obsługiwać żądania, które przychodzą do określonego gniazda.

Klasa  Socket  jest tak naprawdę klientem Socket, dzięki któremu możemy wysłać wiadomość do jakiegoś gniazda i otrzymać odpowiedź.

Jak wysłać wiadomość do jakiegoś gniazda:

Przykład
//создаем сокет
Socket clientSocket = new Socket("localhost", 4444);

//получаем OutputStream
OutputStream outputStream = clientSocket.getOutputStream();
PrintWriter out = new PrintWriter(outputStream, true);
out.println("Kiss my shiny metal ass!");
out.flush();

//читаем ответ
InputStream inputStream = clientSocket.getInputStream();
BufferedReader in = new BufferedReader(new InputStreamReader(inputStream));
String answer = in.readLine();

- Wszystko jest bardzo podobne do pobierania pliku z Internetu.

„To dlatego, kochanie, że tam też używa się gniazdek.

Gniazda są używane w rdzeniu wszystkiego lub prawie wszystkiego w sieci.

Tutaj  możesz  przeczytać dodatkowe informacje.

Dzięki za wykład Rysiu.

- To nie wszystko. śnić.

Teraz zrozumiemy, jak działa gniazdo serwera.

To działa trochę bardziej skomplikowane.

Przykład
//создаем obiekt serwer-сокет
ServerSocket serverSocket = new ServerSocket(4444); //порт

//в цикле обрабатываем входящие соединения.
while (true)
{
 //метод accept ждет, пока кто-то не подключится.
 Socket socket = serverSocket.accept();

 //читаем сообщение
 InputStream inputStream = socket.getInputStream();
 BufferedReader in = new BufferedReader(new InputStreamReader(inputStream));
 String message = in.readLine();

 //придумываем ответ – просто разворачиваем строку задом наперед
 String reverseMessage = new StringBuilder(message).reverse().toString();

 //отправляем ответ
 OutputStream outputStream = socket.getOutputStream();
 PrintWriter out = new PrintWriter(outputStream, true);
 out.println(reverseMessage);
 out.flush();
}

Chciałbym zwrócić Państwa uwagę na kilka kwestii.

Moment 1: Aby utworzyć gniazdo, należy określić adres IP (lub domenę) oraz port. Aby utworzyć gniazdo serwera, tylko port. Gniazdo serwera pojawia się tylko na komputerze, na którym zostało utworzone.

Moment 2: Klasa ServerSocket posiada metodę accept(), która po wywołaniu czeka na połączenie przychodzące. Te. metoda będzie działać w nieskończoność, dopóki jakieś gniazdo klienta nie spróbuje uzyskać do niej dostępu. Metoda accept() zaakceptuje połączenie, utworzy obiekt gniazda do komunikacji, a następnie zwróci ten obiekt.

Z punktu widzenia programisty Javy gniazdo to dwa strumienie - InputStream, z którego można odczytywać komunikaty/dane oraz OutputStream, w którym można zapisywać komunikaty/dane.

Kiedy tworzysz gniazdo serwera, w rzeczywistości istnieje port, z którym mogą łączyć się gniazda z innych komputerów. Ale do tego muszą poprawnie określić numer portu naszego gniazda i adres IP naszego komputera. Cóż, albo jego nazwa domeny.

Oto interesujący przykład dla Ciebie, możesz spróbować go przeanalizować i wykonać:

http://habrahabr.ru/post/69136/

Chodzi o to, że za pomocą gniazda serwera napisany jest prymitywny serwer WWW, do którego można po prostu uzyskać dostęp z przeglądarki.

- Wow! Serwer internetowy? Fajny! Przestudiuję to bardzo dokładnie.

Dzięki Risza.

— Wszyscy, Amigo, idźcie odpocząć!