undefined

Socket

Java Collections
10 уровень , 7 лекция
Открыта

— Привет, Амиго!

— Здорово, Риша!

— Тема сегодняшней лекции – Сокеты. Socket в переводе с английского – Розетка.

Ты уже знаешь, что у каждого компьютера в сети есть его уникальный IP-адрес.

— Ага.

— И вот представь, что у тебя есть несколько компьютеров и на каждом компьютере запущено с десяток программ, которые работают с интернетом: Skype, ICQ, и т.д.

И эти программы хотят общаться между собой.

Надо сделать так, чтобы они друг другу «не мешали». Чтобы Skype связывался со Skype’ом, ICQ с ICQ и т.д.

Помнишь, как это проблему решили с URL и веб-серверами?

— Ага, добавили порты.

— Именно.

Это все равно, что в доме сделать много маленьких комнат и объявить его многоквартирным. Каждый порт – это как отдельная квартира.

Так вот IP-адрес – это уникальный номер компьютера, а IP-адрес+порт – это уникальный номер некой «квартиры» (ячейки) в компьютере, которую может занять программа.

Вот такая уникальная ячейка и называется сокет.

У сокета есть его уникальный номер, и состоит он из IP-адреса и номера порта.

— Ага. Т.е. сокет – это номер некой виртуальной ячейки в компьютере, которую может занимать программа? А другая программа будет слать ей в эту ячейку сообщения, и таким образом они будут общаться?

— Не знаю, как ты это понял, но именно так и есть.

— Это моя робоинтуиция подсказала.

— Отлично. Тогда давай немного подробностей.

Сокеты – это фактически самый базовый и самый примитивный способ межсетевого взаимодействия программ.

В Java для работы с сокетами есть два класса. Это классы Socket и ServerSocket.

ServerSocket – это специальный класс, объекты которого выполняют роль сервера – т.е. могу обслуживать запросы, пришедшие на определенный сокет.

Класс Socket – это фактически Socket-клиент, с помощью него мы можем послать сообщение некоторому сокету и получить ответ.

Как послать сообщение какому-то сокету:

Пример
//создаем сокет
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();

— Все очень напоминает скачивание файла из интернета.

— Это потому, детка, что там тоже используются сокеты.

Сокеты используются в основе всего связанного с сетью, ну или почти всего.

Вот тут можешь почитать дополнительную информацию.

— Спасибо за лекцию, Риша.

— Это еще не все. Размечтался.

Теперь мы разберемся, как работает серверный сокет.

Он работает чуток посложнее.

Пример
//создаем объект сервер-сокет
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();
}

Хочу обратить твое внимание на несколько моментов.

Момент 1: Для создания сокета нужно указывать IP-адрес (или домен) и порт. Для создания серверного сокета – только порт. Серверный сокет появляется только на том компьютере, где его создали.

Момент 2: У класса ServerSocket есть метод accept(), который, если его вызвать, будет ждать входящее соединение. Т.е. метод будет выполняться бесконечно долго, пока какой-то клиентский сокет не попробует обратиться к нему. Тогда метод accept() примет соединение, создаст объект сокет для коммуникации и после этого вернет этот объект.

С точки зрения Java-программиста, сокет – это два потока – InputStream из которого можно читать сообщения/данные и OutputStream, куда можно писать сообщения/данные.

Когда ты создаешь серверный сокет, фактически появляется порт, к которому могут подключаться сокеты с других компьютеров. Но для этого им надо правильно указать номер порта нашего сокета и IP-адрес нашего компьютера. Ну, или его доменное имя.

Вот тебе интересный пример, можешь попробовать разобрать его и выполнить:

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

Там весь смысл в том, что с помощью серверного сокета пишется примитивнейший веб-сервер, к которому можно просто обращаться из браузера.

— Ого! Веб-сервер? Круто! Я изучу его очень внимательно.

Спасибо, Риша.

— Все, Амиго, иди отдыхать!

Комментарии (18)
Чтобы просмотреть все комментарии или оставить свой,
перейдите в полную версию
Valua Sinicyn 41 уровень, Харьков
4 марта 2021
Сокеты на человеческом.
Женя 41 уровень, Минск
23 февраля 2021
"— Не знаю, как ты это понял, но именно так и есть". Наверно, если бы у валидатора было сознание, он бы то же самое после успешной валидации сообщал.
Alexey Prilessky 40 уровень, Минск
15 декабря 2020
Интересно про это читать, когда уже в Multithreading Написали свой онлайн чат )
Konstantin 41 уровень, Одесса
28 сентября 2020
"http://habrahabr.ru/post/69136/" - шёл 2020 год
Владислав 41 уровень, Санкт-Петербург
5 августа 2020
По крупицам, со временем, то, что было не понятно еще уровней 5 или 8 назад, то, что казалось абсолютной дичью, начинает выстраиваться в целостную картину. И так с любой максимально не понятной по-началу темой. Спасибо создателям за такие уроки.
Дворник 41 уровень, Санкт-Петербург
9 апреля 2020
http://www.quizful.net/post/java-socket-programming помогло. А статья на хабре ничего не поясняет, что и почему, и как должно быть.
Даниил 41 уровень Master
29 октября 2019
По примеру с хабра запустил свой сервер, но так и не понял как сделать так что бы с других IP адресов получать к нему доступ. Пробовал узнать свой IP и с других устройств (на на своём Wi-Fi) заходить на этот сервер - ничего не получилось. Может кто знает как это сделать?
Andrii Gorshunov 41 уровень Expert
29 апреля 2019
Чтобы проверить как все работает, сначала создаем и запускаем ServerSocket, далее подключаемся обычным сокетом(клиентским)
Andrii Gorshunov 41 уровень Expert
29 апреля 2019
На каком-то там уровне была про сокеты задача. Весь не эффективно она там была вставлена, без предварительной информации.
King 41 уровень, Санкт-Петербург
20 апреля 2019
"Это потому, детка, что там тоже используются сокеты" Уоу, уоу, полегче! Сначала купи мне выпить.