# | Название видеоурока | Видео / Тесты | Решило | Рейтинг | Доступ |
---|---|---|---|---|---|
1 |
![]() |
2 теста |
|||
В этой серии видеоуроков мы подробно разберём принципы работы клиент-серверных программ на основе сокетов и напишем небольшую демонстрационную программу. Рекомендую ознакомиться со статьёй: http://qaru.site/questions/12999/what-is-the-difference-between-a-port-and-a-socket Отчёт отправил: 17947. Dmitry Sinitsin Выполнено за 45 мин. [Показать отчёт] Научился: 1. Что такое клиент-серверное приложение? - софт для связи и совместной работы с другими компьютерами по сети по протоколу TCP\IP гарантирующим доставку пакетов от отправителя получателю. 2. Что такое серверный сокет? - это программный метод принимающий входящие запросы на подключение к доступному порту на ожидающем соединения компьютере в роли Сервера 3. Что такое (клиентский) сокет? - это экземпляр класса Socket способный использовать потоки output и input для соединения с серверным сокетом. 4. Зачем нужны IP, порт, сокет и чем они отличаются? IP - Internet Protocol - нужен для упорядоченной транспортировки пакетов между чётко указанными адресами этого самого IP-протокола Адрес IP версии 4 не превышает значений 256.256.266.256 Потери пакетов не допускаются, если есть коллизии либо утрата пакетов - это не остаётся незамеченным. Порт - числовой код, закрепляемый за нужной программой для адресации нужного пакета данных из сети именно этой программе, а не всей коммуналке в бараке. Чтобы не кричать на всю площадь, "Иванов, к тебе милиция" спокойно набирают в домофоне порт (номер квартирки Иванова) спокойно сообщают ему о визите органов. Сокет - программный комплекс из метода способного коммуницировать с внешними соединениями и сетевой компоненты в виде порта для правильной адресации пересылаемых пакетов между компьютерами |
|||||
2 | Простейший сервер |
2 теста |
|||
На этом уроке мы создадим простейший сервер, который будет принимать подключения от клиентов и проверим его работу из телнета и браузера.
Отчёт отправил: 17947. Dmitry Sinitsin Выполнено за 43 мин. [Показать отчёт] Научился: CTRL+P - подсказки по доступным аргументам В серверном сокете адрес не используется по ненадобности: соединяются С сервером, а не он куда-то стучится для соединения Сложности: telnet не запустился из cmd отчего-то. |
|||||
3 | Автоответчик |
1 тест |
|||
На этом слайде мы напишем сервер-автоответчик, который всем клиентам будет отправлять одно и тоже сообщение.
Отчёт отправил: 17947. Dmitry Sinitsin Выполнено за 40 мин. [Показать отчёт] Научился: getInputStream() - для получения данных getOutputStream() - для отправки данных Сложности: В оси не был подключён компонент Телнет. Включается так: Пуск - Панель управления - Программы и компоненты - Включение или отключение компонентов windows - Клиент Telnet (ставим галочку) |
|||||
4 | Правильный заголовок |
2 теста |
|||
На этом дополнительном слайде мы сформируем правильный HTTP-ответ, который будет выдавать наш сервер, чтобы даже привередливые браузеры смогли бы его отобразить. Отчёт отправил: 17947. Dmitry Sinitsin Выполнено за 39 мин. [Показать отчёт] Научился: \r\n отрабатывает в телнет, в ГуглХроме не принимается Убрав \r получаем работоспособный в браузере обмен Из итории телетайпов: \n использовался для перемещения каретки вниз, а \r использовался для перемещения каретки назад в левую часть страницы |
|||||
5 | Как хорошо уметь читать! |
1 тест |
|||
На этом слайде мы создадим клиента, который сможет прочитать сообщение от сервера.
Отчёт отправил: 17947. Dmitry Sinitsin Выполнено за 1 час. 58 мин. [Показать отчёт] Научился: для сокета клиента уже актуален и сетевой адрес Сервера, куда подключаться, и порт подключения Не забываем добавлять обработку ошибок (Add exception to method signature) в сигнатуру метода в самом конце перед открывающей тело метода фигурной скобкой Клиентский метод .getInputStream().read(); читает один символ sout + ENTER - автосоздание System.out.println(); Код 72 - H (латиницей эйч) в ASCII Класс-обёртка для чтения данных - InputStreamReader ВЫВОДИТ ЛИШЬ ПЕРВУЮ СТРОКУ!!! Проверил опытным путём |
|||||
6 | Клиент-серверный диалог |
|
|||
На этом слайде мы обеспечим полноценное общение между клиентом и сервером через сокет
Отчёт отправил: 17947. Dmitry Sinitsin Выполнено за 1 час. 13 мин. [Показать отчёт] Научился: Клиент: 1. Создает запрос Серверу 2. Отправляет запрос Сервер: 1. Прочитать входящий запрос 2. Отправить ответ В конце сеанса связи читатель(reader) и отправитель(writer) закрываются \n - перевод курсора на новую строку Разная длина сообщения считается из за разницы подхода разных браузеров и приложений к чтению сообщения, как я понял |
|||||
7 | Экспериментальный сервачок |
1 тест |
|||
На этом уроке мы ещё раз построчно и подробно разберём написанные программы и поэкспериментируем с "медленным" сервером. Самостоятельное задание - написать клиент-серверную игру "Угадай число".
Отчёт отправил: 17947. Dmitry Sinitsin Выполнено за 2 час. 0 мин. [Показать отчёт] Научился: throws Exception == бросает исключение Это один из вариантов обработки возможных ошибок при работе кода. Второй вариант - трайкеч СЕРВЕРНЫЙ сокет привязывается к указанному в его аргументах порту и ждёт входящих подключений методом .accept() Если подключений предполагается более одного - организуем бесконечный цикл с помощью while(true) КЛИЕНТСКИЙ сокет создаётся конструктором Socket с аргументами сетевого адреса СЕРВЕРА и порта для подключения НА СЕРВЕРЕ Для ОТПРАВЛЕНИЯ сообщений в поток применяется метод .getOutputStream() помещенный в класс-обёртку OutputStreamWriter, который в свою очередь помещён в класс-обёртку BufferedWriter Эти матрёшки нужны для того, чтобы получить доступ к передаче не только отдельных символов, но и целых строк текста Для ПРИЁМА (чтения) сообщений создаётся отдельная матрёшка READER, аналогичная описанной выше 1. КЛИЕНТ шлёт запрос Серверу строкой заканчивающейся \n 2. СЕРВЕР читает входящее сообщение методом .readLine() - ВАЖНО, чтобы Клиент отправил строку с \n 3. СЕРВЕР записывает входящий пакет (строку) в переменную, обрабатывает её, добавляя подсчёт длины прилетевшей строки 4. Обработанную строку в переменной response СЕРВЕР отправляет через сокет в путь методом .flush() у экземпляра класса writer предварительно подготовленную в законченную строку методами .write() и .newLine() 5. КЛИЕНТ используя reader.readLine() записывает в строковую переменную response полученный ответ Сервера, и выводит его в консоль 6. Закрываются читатель, писатель и КЛИЕНТСКИЙ сокет их связывавший, чтобы не висели вечно в памяти Одиннадцатая Java позволяет запускать код без компиляции из командной строки если весь код в одном файле Сложности: Когда дело дошло до игрищ в командной строке, СЕРВЕР стартовать не желал возвращая ошибку (Иллюстрация номер раз) Решением стало прописать пусть до каталога bin джавы одиннадцатой в переменных средЫ операционной системы. Перезапуск компа и Server started в кармане! Всем удачи на коде, катайтесь - не ломайтесь, приобретайте правильные навыки. |
|||||
8 | Техническое задание |
|
|||
Мы познакомились с принципом работы сокетов. Теперь самое время создать какую-нибудь простую клиент-серверную программку. На этом видео мы сформулируем техническое задание. Попробуйте самостоятельно написать программу по ТЗ. Отчёт отправил: 17947. Dmitry Sinitsin Выполнено за 1 час. 36 мин. [Показать отчёт] Научился: составили техническое задание для создаваемого приложения. 1. Приложение консольное 2. Запуск из командной строки 3. Аргументы из командной строки (консоль) 4. Единая программа с выбором режима из двух вариантов: Сервер или Клиент 5. Программа работает с арифметическими операциями в зависимости от режима запущенного на Сервере Сложности: набрал код Айдара - работает. Записал видео дабы разобраться в организации приложения. В общем и целом всё понятно, но сам из головы бы не написал - в этом проблема, которая как решается пока не понимаю. Может если продолжить учиться, когда-то да появится твердь вместо болота в башке? Видеообзор: MDfSdKCN7qY |
|||||
9 | Основной алгоритм |
|
|||
На этом слайде мы напишем два алгоритма в одной программе: для сервера и для клиента.
Отчёт отправил: 17947. Dmitry Sinitsin Выполнено за 1 час. 37 мин. [Показать отчёт] Научился: реализовали проверку количества аргументов По первому аргументу определяем в какой роли запустится приложение (Сервером или Клиентом) Встав кареткой (курсором) на нереализованный ещё метод и нажав ALT+ ENTER возвращается меню где можно выбрать создание сигнатуры метода СЕРВЕР в бесконечном цикле - принимает входящие "звонки", - записывает в переменные ввод со строк, - считает математику по аргументам - записывает результат в строку - завершает сеанс связи КЛИЕНТский конструктор phone запускается с двумя аргументами (адрес в сети и номер порта) - Записывает первое число - Записывает второе число - Считывает ответ от СЕРВЕРА - Завершает сеанс связи |
|||||
10 | Скелет телефона |
1 тест |
|||
На этом коротком слайде мы создадим метод calculate() и очень быстро набросаем скелет класса Phone, используя возможности кодогенерации Intellij Idea.
Отчёт отправил: 17947. Dmitry Sinitsin Выполнено за 35 мин. [Показать отчёт] Научился: ALT + Enter - варианты решения проблемы в выпадающем меню Работа над ошибками: 1. Самостоятельно создав метод calculate в аргументах не указал тип данных у operation - ошибка не уходила, пока не увидел в этом уроке ответ на свою ошибку 2. Не распарсил в Integer переменные a и b 3. Пытался в дефолтный кейс вбить case default - так не надо делать - там просто дефолт пишется, без кейса ALT+ENTER выпадающим меню позволяет создавать не созданные ещё, но уже указанные в коде, КЛАССЫ, МЕТОДЫ, КОНСТРУКТОРЫ! |
|||||
11 | Универсальный сокет |
|
|||
На этом слайде мы создадим все методы универсального сокета в классе Phone. Протестируйте программу в разных режимах. Придумайте, какую ещё клиент-серверную программу можно написать. Отчёт отправил: 17947. Dmitry Sinitsin Выполнено за 1 час. 27 мин. [Показать отчёт] Научился: объявили в классе Phone сервер и клиент, буферизированный приёмник данных reader и передатчик writer Первый конструктор Phone (тот, у которого лишь один аргумент - порт) - создаёт серверный сокет. При создании экземпляра серверного сокета в аргументы передаётся порт в виде строки, поэтому его парсим в целое число методом Integer.parseInt() ALT + ENTER - добавили трайкеч для отлова ошибок Конструктор клиентского экземпляра сокета принимает уже два аргумента - сетевой адрес и номер порта IntellijIDEA позволяет добавлять аргументы при запуске программы через пункт Edit Configuration - выпадающее меню у кнопки запуска с названием класса Необходимости в добавлении \r в моём случае не было. Как в видео - в одну строку у меня не выводило при отсутствии \r и указанной лишь \n И так и эдак перенос строки выполнялся успешно CTRL + C - остановка Сервера в командной строке Звездочка, используемая в качестве аргумента "умножение" должна быть заключена в скобки, иначе она воспринимается командной строкой как знак "ВСЕ" |
|||||
12 | ФИНАЛЬНЫЙ УРОК |
без видео 1 тест |
|||
Оставьте отзыв об этом миникурсе и отчитайтесь за самостоятельное задание.
Отчёт отправил: 17947. Dmitry Sinitsin Выполнено за 1 час. 58 мин. [Показать отчёт] Научился: Клиентский метод .getInputStream().read() читает один символ, тогда как класс-обёртка для чтения данных - InputStreamReader способен читать уже строку. Применили цепочку из создания объектов, на вершине которой классы BufferedReader и BufferedWriter, способные к чтению и созданию полных строк, которые передавались через сетевой протокол между клиентом и сервером. Приложение для обмена, обработки Сервером полученного, и выведения на экран результата отправки-обработки-приёма реализовывалось как в рамках одного класса (это при том, что запуск доступен в двух ролях Сервера или Клиента), так и в двух классах. Первый класс Socketor имеет точку входа в программу, отвечает за выбор роли, в которой запускается сокет (сервером или клиентом). При каждом запуске создаёт новый экземпляр класса и в зависимости ОТ КОЛИЧЕСТВА принятых от пользователя аргументов запускает: метод runServer в роли Сервера или метод runClient в роли Клиента. =============== Метод runServer создает СОКЕТ - новый экземпляр класса Phone принимая аргументом номер порта для работы. В бесконечном цикле запускается метод приёма входящих пакетов извне. В первой полученной строке записывает строковую переменную a. Во второй полученной строке записывает строковую переменную b. В целочисленную переменную записывает результат работы метода калькуляции, принимающего аргументами (все строкового типа) знак математической операции, а и b - числа для математической операции. О полученном решении создаётся строковая переменная, которая: - выводится на экран в консоли Сервера методом System.out.println - передаётся Клиенту для вывода на экран методом phone.writeLine После вывода на экран соединение с Клиентом закрывается и Сервер возвращается циклом к ожиданию нового входящего соединения. В этом же цикле реализована проверка деления на ноль. ================ Метод калькуляции парсит в целые числа полученные строковые аргументы, и в зависимости от типа операции возвращает целочисленные результат расчётов. ================ Метод runClient принимает строковые аргументы: - сетевой адрес - номер порта - а и b - числа для математической операции. Создаётся экземпляр сокета с двумя аргументами (адрес и порт). Сокет Клиента построчно отправляет а и b - числа для математической операции. Затем с помощью метода readLine() Клиент получает результат вычислений и выводит его в консоль на экран. ################ Второй класс Phone занимается реализацией сокетов Сервера и Клиента. Здесь же составлена матрёшка экземпляров классов, способных обрабатывать строковые символы и целые строки из сетевого трафика. Во всех методах класса Phone применен отлов ошибок try-catch Видеообзор: wZqkR2hb31k |
|||||
13 |
![]() |
|
|||
На этом слайде мы поговорим о многопоточности, рассмотрим несколько примеров, кода имеет смысл разделять задачу на потоки, а когда нет. На следующих слайдах мы напишем простой многопоточный сокет для сервера на языке Java
Отчёт отправил: 17947. Dmitry Sinitsin Выполнено за 34 мин. [Показать отчёт] Научился: два примера многопоточности - эффективный и нет: бортпроводники в салоне самолета за работой - эффективно Более двух пилотов в кабине самолета - неэффективно (КВС и второго пилота более чем достаточно для успешного полёта, дополнительные ПИЛОТЫ не добавляют функциональности авиасудну) Многопоточность неактуальна в случае перевозки одного пассажира. Для перевозки одного пассажира требуется одно транспортное средство. Если предоставить пассажиру более одного ТС, ему от этого легче не станет - на двух поездах одновременно не уедешь Многопоточность крайне полезна в работе диспетчеров Московского Авиаузла. Нагрузка прибывающих регулярных рейсов велика, вылетающих не меньше - распараллеливание работы сопровождения трафика повышает скорость обслуживания и безопасность Многопоточный доступ к серверу полезен при организации модемного пула - чем больше модемов готовых к входящим подключениям и не встречающих звонки сигналами BUSY BUSY!!! повышает доступность сервера и радует клиентов Модем один - а клиентов тьма (обратная картина) - один обслуживается, для остальных при попытке дозвониться - ЗАНЯТО - неэффективно, недовольны все, кроме первого подключившегося Видеообзор: wjx77MQL35E |
|||||
14 | VIP. Два потока |
1 тест |
|||
На этом слайде мы создадим простейшую программу с двумя потоками.
Отчёт отправил: 17947. Dmitry Sinitsin Выполнено за 2 час. 29 мин. [Показать отчёт] Научился: для создания потока а) наследуем от Thread (extends Thread) или б) имплементируем Runnable (implements Runnable) Метод run запускает отдельный поток sleep(), wait() снижают нагрузку на процессор, создавая паузы выполнения инструкций в коде Для создания нового отдельного потока создаётся новый экземпляр класса Thread с передачей ему аргументом экземпляра first из класса Workerа имплементированного от Runnable Чтобы ограничить доступ к методам, и позволить только одному потоку менять данные там в какой-либо момент времени, мы используем ключевое слово synchronized. Synchronized позволяет заблокировать доступ к методу или части кода, если его уже использует другой поток. |
|||||
15 | VIP. Синхрофазатрон |
|
|||
На этом слайде мы создадим коллизию и узнаем, как от неё избавиться.
Отчёт отправил: 17947. Dmitry Sinitsin Выполнено за 32 мин. [Показать отчёт] Научился: volatile - применяется для моментального чтения переменных, минуя кеширование synchronized - добавляем в сигнатуру метода, когда надо, чтобы к нему в один момент времени имел доступ один процесс, а не более одного! Пауза обусловлена уникальным доступом к методу слип для всех пяти потоков, как я понял |
|||||
16 | VIP. Функциональное потокообразование |
2 теста |
|||
На этом коротком слайде мы узнаем, как создать поток через функциональное программирование.
Отчёт отправил: 17947. Dmitry Sinitsin Выполнено за 25 мин. [Показать отчёт] Научился: Лямбда == набор инструкций выделяемых в отдельную переменную и затем многократно вызываемую в различных местах Лямбда-оператор это стрелка -> Оператор разделяет лямбда-выражение на две части: левая - список параметров выражения правая это тело лямбда-выражения, где выполняются все действия |
|||||
17 | VIP. Мультики на сервере |
1 тест |
|||
На этом слайде мы встроим многопоточность в клиент-серверную программу Socketor и продемонстрируем достигнутый эффект.
Отчёт отправил: 17947. Dmitry Sinitsin Выполнено за 16 час. 15 мин. [Показать отчёт] Научился: при добавлении метода sleep необходимо позаботиться о трайкече с InterruptedException Каждый клиент ждёт обработки с ожиданием 7 секунд предыдущего клиента, и лишь после завершения обработки того, получает доступ к Серверу для своего подключения. Паравозиком идут клиенты, как вагончики, не перепутываются. Порт для всех один, двое сразу не подключатся. Второй phone на тот же порт зацепить не получится - порт уже занят! Реализовали в Phone конструктором создание каждому клиенту своего серверного сокета - ЭТО ПЕРЕШЛИ К МНОГОПОТОЧНОМУ ВАРИАНТУ ALT + INSERT - создание конструктора в контексте При созданных разных потоках у каждого клиента, обработка математическихЪ примеровЪ пошла по принципу - все на батьку! Видеообзор: phyUD1liUwk |
|||||
18 | VIP. Динамичная многопоточность |
|
|||
На этом заключительном видеоуроке мы познакомимся с другим способом создания многопоточного сервера. Если на предыдущем уроке у нас "крутилось" несколько копий одной программы, то теперь мы будем создавать новый поток при каждом подключении клиента. Сравните оба варианта и напишите в отчёте, какой подход вам больше понравился и почему. Отчёт отправил: 17947. Dmitry Sinitsin Выполнено за 2 час. 20 мин. [Показать отчёт] Научился: в предыдущем уроке количество копий программы параметризировалось числом из аргументов при запуске сервера, и эти копии ожидали подключений как кассы с кассирами во всеоружии в супермеркато Сокеты в прошлом уроке копировались (создавались копии программы) в количестве из аргумента запуска сервера 10 минута видео - гвоздь программы при создании лямбда оператора ))) "Здесь мы пишем вот такую вот фигулинку..." %time:~6,2% выбрать (взять) с шестого индекса два символа %time:~9,2% выбрать (взять) с девятого индекса два символа Динамическое создание сокетов выглядит интереснее своей гибкостью. |
|||||
Итого: 18 видеоуроков |
3 час. 22 мин. 15 тестов |
9 чел. | |||
Финалисты: Yefim, Chip, Иван Воронин, Tekashnik, Александр, vip, Айдар, Dmitry Sinitsin, Anatoli . |