# | Название видеоурока | Видео / Тесты | Решило | Рейтинг | Доступ |
---|---|---|---|---|---|
1 |
![]() |
2 теста |
|||
В этой серии видеоуроков мы подробно разберём принципы работы клиент-серверных программ на основе сокетов и напишем небольшую демонстрационную программу. Рекомендую ознакомиться со статьёй: http://qaru.site/questions/12999/what-is-the-difference-between-a-port-and-a-socket Отчёт отправил: 13417. Chip Выполнено за 49 мин. [Показать отчёт] Научился: Клиент-серверное приложение состоит из двух частей: из клиента и сервера. Сервер прослушивает линию и ожидает подключения клиентов, обрабатывает их запросы и возвращает ответы. Клиенты обращаются к серверу за необходимой информацией. IP-адрес необходим для задания уникального адреса в сети, по которому ПО сетевого протокола IP сможет найти хост. Соответственно порт необходим для функционирования транспортного протокола, где каждый порт привязывается к определенной службе на хосте. Таким образом, IP-адрес определяет хост в сети, а порт определяет службу на этом хосте. Имея эту пару можно создать канал общения клиента и сервера. Само общение реализуется с помощью создания сокета. Сокет - это экземпляр "канала", программная абстракция соединения между процессами клиента и сервера. |
|||||
2 | Простейший сервер |
2 теста |
|||
На этом уроке мы создадим простейший сервер, который будет принимать подключения от клиентов и проверим его работу из телнета и браузера.
Отчёт отправил: 13417. Chip Выполнено за 1 час. 26 мин. [Показать отчёт] Научился: При вызове accept процесс сервера блокируется до тех пор, пока в очереди не появится запрос клиента. Написал программу на языке Си. Проверил созданный сервер через браузер и telnet. Через браузер пока что получается неинформативный результат работы, поэтому прикрепил скриншот вывода программы telnet. |
|||||
3 | Автоответчик |
1 тест |
|||
На этом слайде мы напишем сервер-автоответчик, который всем клиентам будет отправлять одно и тоже сообщение.
Отчёт отправил: 13417. Chip Выполнено за 31 мин. [Показать отчёт] Научился: Научился отправлять сообщение клиенту, создавать сервер-автоответчик. |
|||||
4 | Правильный заголовок |
2 теста |
|||
На этом дополнительном слайде мы сформируем правильный HTTP-ответ, который будет выдавать наш сервер, чтобы даже привередливые браузеры смогли бы его отобразить. Отчёт отправил: 13417. Chip Выполнено за 3 час. 13 мин. [Показать отчёт] Научился: Научился отправлять http-ответ сервера клиенту. Проверил на своём браузере Firefox, установил браузеры Chromium и GNOME Epiphany- везде работает как надо. Дополнительно почитал про другие заголовки, узнал что многие из них связаны с кешированием. Добавил заголовок "Content-Length", который высчитывается перед отправкой сообщения. |
|||||
5 | Как хорошо уметь читать! |
1 тест |
|||
На этом слайде мы создадим клиента, который сможет прочитать сообщение от сервера.
Отчёт отправил: 13417. Chip Выполнено за 55 мин. [Показать отчёт] Научился: Научился создавать сокет на клиентской стороне, подключать его к серверу и получать данные от сервера. |
|||||
6 | Клиент-серверный диалог |
|
|||
На этом слайде мы обеспечим полноценное общение между клиентом и сервером через сокет
Отчёт отправил: 13417. Chip Выполнено за 1 час. 30 мин. [Показать отчёт] Научился: Научился передаче сообщений от клиента к серверу и обратно. Теперь сервер обрабатывает запрос клиента и отвечает на него вполне осмысленно, в зависимости от запроса клиента. |
|||||
7 | Экспериментальный сервачок |
1 тест |
|||
На этом уроке мы ещё раз построчно и подробно разберём написанные программы и поэкспериментируем с "медленным" сервером. Самостоятельное задание - написать клиент-серверную игру "Угадай число".
Отчёт отправил: 13417. Chip Выполнено за 3 час. 23 мин. [Показать отчёт] Научился: Реализовал игру угадай число. Сервер загадывает число от 1 до 100, затем ждёт подключения клиентов. Чтобы жизнь клиента не была слишком скучной, первое число, которое загадывает клиент я сделал рандомным в том же интервале от 1 до 100. Затем клиент отправляет это число на сервер и он отвечает ему, является ли число клиента меньше, больше или равно загаданному. Клиент получает ответ и уже далее вычисляет новое число путем деления пополам области поиска. Я добавил задержку между итерациями угадывания числа на клиенте в 2 секунды, чтобы результат получился более интерактивным. Интересная задачка, спасибо Евгений Витольдович, неплохо увлёкся во время пересылок данных между клиентом и сервером :) Видеообзор: xoDz4e5yrUs |
|||||
8 | Техническое задание |
|
|||
Мы познакомились с принципом работы сокетов. Теперь самое время создать какую-нибудь простую клиент-серверную программку. На этом видео мы сформулируем техническое задание. Попробуйте самостоятельно написать программу по ТЗ. Отчёт отправил: 13417. Chip Выполнено за 9 час. 34 мин. [Показать отчёт] Научился: Реализовал программу Socketor - клиент-серверный калькулятор. Поразительно, но сам клиент-серверный обмен был написан довольно быстро :) Много времени ушло на парсинг командной строки, обработку ошибок ввода, проверка деления на ноль. Спасибо Евгений Витольдович, я хорошо попрактиковался :) Видеообзор: iS0WtqiPSoA |
|||||
9 | Основной алгоритм |
|
|||
На этом слайде мы напишем два алгоритма в одной программе: для сервера и для клиента.
Отчёт отправил: 13417. Chip Выполнено за 1 час. 54 мин. [Показать отчёт] Научился: Так как эту программу я самостоятельно написал на прошлом уроке, то сейчас я решил с нуля переписать ее вслед за Евгением Витольдовичем, без излишеств и стремясь к созданию аналогичной структуры программы. |
|||||
10 | Скелет телефона |
1 тест |
|||
На этом коротком слайде мы создадим метод calculate() и очень быстро набросаем скелет класса Phone, используя возможности кодогенерации Intellij Idea.
Отчёт отправил: 13417. Chip Выполнено за 27 мин. [Показать отчёт] Научился: Понравились возможности кодогенерации IDE и комментарии Евгения Витольдовича "раз-два готово, тыг-дык готово, раз-раз готово, тяп-ляп, не, тяп-ляп не надо :)" |
|||||
11 | Универсальный сокет |
|
|||
На этом слайде мы создадим все методы универсального сокета в классе Phone. Протестируйте программу в разных режимах. Придумайте, какую ещё клиент-серверную программу можно написать. Отчёт отправил: 13417. Chip Выполнено за 9 час. 24 мин. [Показать отчёт] Научился: Решил полностью с нуля написать все требуемые функции, не копируя свои прежние наработки. В итоге, повторил и лучше закрепил свои навыки и знания. Попрактиковался в работе с отладчиком gdb. По поводу новых видеокурсов, я бы порекомендовал вам, Евгений Витольдович, курс по созданию инсталлятора программ. Многие формулисты уже создали множество программ на этом проекте, а установкой до сих пор не занимались. Например, я использую систему сборки проекта Autotools, которая позволяет скомпилировать, установить и развернуть приложение на другом компьютере Linux. Так же я практиковался в упаковке программ в rpm-пакеты, которые устанавливаются всего лишь одной командой в терминале. Пора бы другим формулистам устранить этот профессиональный пробел в создании инсталлятора для Windows. Возможно это будет просто мини-курс по использованию известного инсталлятора. Или это будет новая программа, которая сама раскидывает данные пользователя по папкам, работает с реестром и прочее. Интересно будет узнать ваше и мнение других формулистов :) |
|||||
12 | ФИНАЛЬНЫЙ УРОК |
без видео 1 тест |
|||
Оставьте отзыв об этом миникурсе и отчитайтесь за самостоятельное задание.
Отчёт отправил: 13417. Chip Выполнено за 35 мин. [Показать отчёт] Научился: Крутой курс! Я поразился насколько просто в Java можно создать клиент-серверное приложение. В добавок к этому в распоряжении программиста имеются дополнительные классы-обертки над потоками ввода-вывода у сокетов, чтобы не мелочиться с буферными массивами. Раз-два готово! :) В этом курсе создается программа сокетный калькулятор - интересный пример клиент-серверного взаимодействия. Было самостоятельное задание написать программу угадай число или быки и коровы. Я выбрал угадай число. Рекомендую всем пройти этот курс - уроки короткие, кода мало, информация полезна :) |
|||||
13 |
![]() |
|
|||
На этом слайде мы поговорим о многопоточности, рассмотрим несколько примеров, кода имеет смысл разделять задачу на потоки, а когда нет. На следующих слайдах мы напишем простой многопоточный сокет для сервера на языке Java
Отчёт отправил: 13417. Chip Выполнено за 35 мин. [Показать отчёт] Научился: В видео интересные примеры многопоточности :) Мой вариант, когда многопоточность может быть эффективна. Например, стоит задача найти минимальный элемент в огромном массиве. Можно разбить этот массив на несколько более мелких, далее создать несколько потоков, каждый из которых находит минимальный элемент в своём подмассиве. В результате, у нас получится новый массив минимальных элементов и уже в нем основной поток может найти самый минимальный элемент. Чем больше массив и чем больше потоков, тем большая выгода от многопоточности. Вариант, когда многопоточность не эффективна. Сложно придумать вариант, если я правильно понял, основная идея в том, что задачу сложно распараллелить, отсутствуют независимые части, промежуточные этапы и результаты. Поэтому я выбрал следующий вариант: вывод информации в терминал или работа машинистки на печатной машинке. Как известно, информация выводится строго сверху-вниз и слева-направо. (Допустим терминал крайне допотопный и не умеет перемещать курсор) Невозможно напечатать сначала первую строку, потом прыгнуть на пятую, вывести одну букву и потом обратно на первую. Поэтому невозможно разбить задачу вывода на несколько потоков - когда один поток выводит первую строку, другой одновременно с ним пятую и так далее. Вся работа упирается в мощность одного процесса или в скорость работы одной машинистки. Другими словами, если стоит задача набрать один текст формата А4 на печатной машинке, то несколько машинисток не смогут одновременно набирать на одной машинке, скорость работы упирается в скорость набора машинистки. Вы скажете, что можно набирать одновременно на нескольких машинках и получится несколько копий одного листа А4, но суть не меняется. Другие машинистки не могут скооперироваться, что напечатать быстрее один экземпляр. Сложности: Придумать варианты эффективности и не эффективности многопоточности. |
|||||
14 | VIP. Два потока |
1 тест |
|||
На этом слайде мы создадим простейшую программу с двумя потоками.
Отчёт отправил: 13417. Chip Выполнено за 6 час. 10 мин. [Показать отчёт] Научился: Научился создавать потоки с помощью функции системного вызова clone. В моем случае, создание потока похоже на способ в Java, когда новый поток запускает указанную функцию. Добавил третий поток, для вывода текста "Third". Чтобы вывод программы не улетал далеко за пределы экрана, добавил задержку в 1 секунду после вывода сообщения. |
|||||
15 | VIP. Синхрофазатрон |
|
|||
На этом слайде мы создадим коллизию и узнаем, как от неё избавиться.
Отчёт отправил: 13417. Chip Выполнено за 7 час. 47 мин. [Показать отчёт] Научился: Интересный материал урока, увидел коллизию и способ борьбы с ней. Мне потребовалось изучить дополнительный материал. Возникла масса проблем начиная с того, что нужно было корректно перехватывать завершение работы дочерних потоков и заканчивая созданием синхронизирующего механизма для защиты доступа к переменной count. На видео для языка Java для этого использовалось ключевое слово synchronized, я реализовал схожее поведение через создание фьютекса, ух, было весело:) Попутно узнал про функцию nanosecond, которая позволяет устанавливать задержку в наносекундах. |
|||||
16 | VIP. Функциональное потокообразование |
2 теста |
|||
На этом коротком слайде мы узнаем, как создать поток через функциональное программирование.
Отчёт отправил: 13417. Chip Выполнено за 1 час. 54 мин. [Показать отчёт] Научился: В языке Си нет поддержки функционального программирования, поэтому я решил выполнить этот урок на языке Java. Сначала скачал jdk 11, скомпилировал программу, попробовал запустить, система сказала, что версия моего .class файла ниже, чем поддерживая версия рантайма в операционной системе. Посмотрел текущую версию рантайма, она оказалась равной 1.8, то есть 8, если я правильно понял. Я решил не менять свой рантайм, скачал другую версию jdk 1.8, скомпилировал - запустил - работает. Ура, я справился с Java. Хотел было уже отправить отчёт, но тут подумал, ну если Си не способен создать лямбду, может тогда старший брат С++ поможет? Набрал код на этом языке, запустил, тоже работает. Тут я использовал средства стандартной библиотеки, поэтому код похож на код Java, а не выкрутасы с системными вызовами как было в Си :) Чтобы потоки выполнялись более-менее параллельно, я добавил задержку в 10 мс между итерациями, как и было предложено сделать в видеоуроке. |
|||||
17 | VIP. Мультики на сервере |
1 тест |
|||
На этом слайде мы встроим многопоточность в клиент-серверную программу Socketor и продемонстрируем достигнутый эффект.
Отчёт отправил: 13417. Chip Выполнено за 3 час. 39 мин. [Показать отчёт] Научился: В этом уроке я научился создавать многопоточный сервер. Мне понравилось то, что мы здесь объединили две программы, две рассмотренные в этом курсе темы. Первая это однопоточное клиент-серверное приложение, а второе это потоки. Для проверки работы сервера, я написал скрипт на bash, который симулирует запуск указанного количества клиентов с интервалом в 100мс. В сервер тоже добавил задержку симуляции сложной обработки, 3 секунды на один запрос. Курс мне понравился, Евгений Витольдович выбрал отличную тему для демонстрации многопоточности, спасибо за интересный материал ! :) Видеообзор: PebAfxYxvg8 |
|||||
18 | VIP. Динамичная многопоточность |
|
|||
На этом заключительном видеоуроке мы познакомимся с другим способом создания многопоточного сервера. Если на предыдущем уроке у нас "крутилось" несколько копий одной программы, то теперь мы будем создавать новый поток при каждом подключении клиента. Сравните оба варианта и напишите в отчёте, какой подход вам больше понравился и почему. Отчёт отправил: 13417. Chip Выполнено за 2 час. 52 мин. [Показать отчёт] Научился: Чтобы организовать динамичную многопоточность, мне нужно было придумать как организовать хранение запущенных потоков. В моем случае нет доброго сборщика мусора, я не могу просто так создать анонимный поток и забыть про него, будет утечка памяти. Поэтому для хранения запущенных потоков выбрал двусвязный список в качестве структуры данных, чтобы можно было легко удалять отработавшие потоки из середины списка. Потребовалось освежить знания о том, как добавлять и удалять элементы из списка. Написал свой простой двусвязный список. Чтобы вовремя удалять потоки из списка, мне нужно было пойти дальше и изучить системный вызов poll, который в течение указанного таймаута ждёт подключения клиента. Если клиент пришёл - он обрабатывается acceptом, для него запускается новый поток и потом выполнятся очистка памяти. Если клиент не пришел, accept пропускается и сразу выполняется очистка памяти. В уроке был вопрос, как можно прервать работу сервера. В моем случае я просто посылаю сигнал SIGINT с помощью Ctrl+C. Но чтобы полностью очистить память перед выходом, мне потребовалось научиться перехватывать сигналы. Вариант с динамичной многопоточностью лучше, чем с фиксированной, так как ресурсы не простаивают зря. На видео я запускал клиенты с помощью bash-скрипта, который принимает в качестве параметров количество клиентов, интервал генерации случайных чисел и интервал между обращения к серверу. В общем, хорошо попрактиковался, очень доволен, спасибо :) Видеообзор: znmc-j0Xppw |
|||||
Итого: 18 видеоуроков |
3 час. 22 мин. 15 тестов |
9 чел. | |||
Финалисты: Yefim, Chip, Иван Воронин, Tekashnik, Александр, vip, Айдар, Dmitry Sinitsin, Anatoli . |