Обучение c# видеоуроки

Формула программиста

основатель — Волосатов Евгений Витольдович

Клуб формулистов - Ежемесячная подписка

Вступление в Клуб Формулистов на выгодных условиях для НОВЫХ участников.

После взноса  999  499 руб. вы получите подписку
в Клуб Формулистов на 30 дней и 256 байт для быстрого старта.
Байты используются для открытия более одного урока в день, по 50 байт за урок.

Стоимость 1 дня за первый месяц: всего 16 рублей.

Первый взнос - 499 руб./30 дней.

Через 30 дней будет списано 3,000 2,400 руб.
за продление подписки в Клуб на 30 дней + подарок 512 байт.

Так будет продолжаться каждые 30 дней, пока вы не отмените подписку.
Средства будет автоматически считываться с вашей карты.
Вы в любой момент сможете отказаться от продления Клуба.

Только ДО КОНЦА НЕДЕЛИ -
-50% скидка на первый взнос, всего 499 (вместо 999) рублей!
-20% скидка на ЕЖЕМЕСЯЧНЫЙ платёж!
Всего 2400 руб/месяц (вместо 3000 руб/месяц), или 80 руб./день - цена чашки кофе.


Стоимость 1 дня: 80 руб.

Хочу вступить!

Также есть другие варианты оплаты участия в КФ:

Билет в клуб формулистов на ...
30+ дней | 60 дней | 150 дней | 380 дней | 1000 дней

Внимание!
Стоимость участия в Клубе формулистов увеличивается 1 числа каждого месяца на 100 рублей.
При оформления подписки стоимость остаётся постоянной, пока подписка не будет отменена.







Первый взнос - 499 руб./30 дней + 500 байт.
Последующие взносы - 3,000 2400 руб./месяц + 512 байт.



Список уроков | фото | видео

# Название видеоурока Видео / Тесты Решило Рейтинг Доступ
1 FREE Что такое сокет 00:09:10
2 теста
31 чел. ★ 4.7 Done
  В этой серии видеоуроков мы подробно разберём принципы работы клиент-серверных программ на основе сокетов и напишем небольшую демонстрационную программу.

Рекомендую ознакомиться со статьёй:
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 Простейший сервер 00:07:20
2 теста
22 чел. ★ 5 Done
  На этом уроке мы создадим простейший сервер, который будет принимать подключения от клиентов и проверим его работу из  телнета и браузера.
Отчёт отправил: 17947. Dmitry Sinitsin Выполнено за 43 мин. [Показать отчёт]
Научился: CTRL+P - подсказки по доступным аргументам В серверном сокете адрес не используется по ненадобности: соединяются С сервером, а не он куда-то стучится для соединения 
Сложности: telnet не запустился из cmd отчего-то. 
3 Автоответчик 00:10:27
1 тест
21 чел. ★ 4.9 Done
  На этом слайде мы напишем сервер-автоответчик, который всем клиентам будет отправлять одно и тоже сообщение.
Отчёт отправил: 17947. Dmitry Sinitsin Выполнено за 40 мин. [Показать отчёт]
Научился: getInputStream() - для получения данных getOutputStream() - для отправки данных 
Сложности: В оси не был подключён компонент Телнет. Включается так: Пуск - Панель управления - Программы и компоненты - Включение или отключение компонентов windows - Клиент Telnet (ставим галочку) 
4 Правильный заголовок 00:06:26
2 теста
13 чел. ★ 5 Done
  На этом дополнительном слайде мы сформируем правильный HTTP-ответ,
который будет выдавать наш сервер, чтобы даже привередливые браузеры смогли бы его отобразить.

Отчёт отправил: 17947. Dmitry Sinitsin Выполнено за 39 мин. [Показать отчёт]
Научился: \r\n отрабатывает в телнет, в ГуглХроме не принимается Убрав \r получаем работоспособный в браузере обмен Из итории телетайпов: \n использовался для перемещения каретки вниз, а \r использовался для перемещения каретки назад в левую часть страницы 
5 Как хорошо уметь читать! 00:10:20
1 тест
18 чел. ★ 5 Done
  На этом слайде мы создадим клиента, который сможет прочитать сообщение от сервера.
Отчёт отправил: 17947. Dmitry Sinitsin Выполнено за 1 час. 58 мин. [Показать отчёт]
Научился: для сокета клиента уже актуален и сетевой адрес Сервера, куда подключаться, и порт подключения Не забываем добавлять обработку ошибок (Add exception to method signature) в сигнатуру метода в самом конце перед открывающей тело метода фигурной скобкой Клиентский метод .getInputStream().read(); читает один символ sout + ENTER - автосоздание System.out.println(); Код 72 - H (латиницей эйч) в ASCII Класс-обёртка для чтения данных - InputStreamReader ВЫВОДИТ ЛИШЬ ПЕРВУЮ СТРОКУ!!! Проверил опытным путём 
6 Клиент-серверный диалог 00:14:14
15 чел. ★ 5 Done
  На этом слайде мы обеспечим полноценное общение между клиентом и сервером через сокет
Отчёт отправил: 17947. Dmitry Sinitsin Выполнено за 1 час. 13 мин. [Показать отчёт]
Научился: Клиент: 1. Создает запрос Серверу 2. Отправляет запрос Сервер: 1. Прочитать входящий запрос 2. Отправить ответ В конце сеанса связи читатель(reader) и отправитель(writer) закрываются \n - перевод курсора на новую строку Разная длина сообщения считается из за разницы подхода разных браузеров и приложений к чтению сообщения, как я понял 
7 Экспериментальный сервачок 00:12:25
1 тест
14 чел. ★ 5 Done
  На этом уроке мы ещё раз построчно и подробно разберём написанные программы и поэкспериментируем с "медленным" сервером. Самостоятельное задание - написать клиент-серверную игру "Угадай число".
Отчёт отправил: 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 Техническое задание 00:06:25
11 чел. ★ 5 Done
  Мы познакомились с принципом работы сокетов.
Теперь самое время создать какую-нибудь простую клиент-серверную программку.
На этом видео мы сформулируем техническое задание.
Попробуйте самостоятельно написать программу по ТЗ.
Отчёт отправил: 17947. Dmitry Sinitsin Выполнено за 1 час. 36 мин. [Показать отчёт]
Научился: составили техническое задание для создаваемого приложения. 1. Приложение консольное 2. Запуск из командной строки 3. Аргументы из командной строки (консоль) 4. Единая программа с выбором режима из двух вариантов: Сервер или Клиент 5. Программа работает с арифметическими операциями в зависимости от режима запущенного на Сервере 
Сложности: набрал код Айдара - работает. Записал видео дабы разобраться в организации приложения. В общем и целом всё понятно, но сам из головы бы не написал - в этом проблема, которая как решается пока не понимаю. Может если продолжить учиться, когда-то да появится твердь вместо болота в башке? 
Видеообзор: MDfSdKCN7qY
9 Основной алгоритм 00:13:05
11 чел. ★ 5 Done
  На этом слайде мы напишем два алгоритма в одной программе: для сервера и для клиента.
Отчёт отправил: 17947. Dmitry Sinitsin Выполнено за 1 час. 37 мин. [Показать отчёт]
Научился: реализовали проверку количества аргументов По первому аргументу определяем в какой роли запустится приложение (Сервером или Клиентом) Встав кареткой (курсором) на нереализованный ещё метод и нажав ALT+ ENTER возвращается меню где можно выбрать создание сигнатуры метода СЕРВЕР в бесконечном цикле - принимает входящие "звонки", - записывает в переменные ввод со строк, - считает математику по аргументам - записывает результат в строку - завершает сеанс связи КЛИЕНТский конструктор phone запускается с двумя аргументами (адрес в сети и номер порта) - Записывает первое число - Записывает второе число - Считывает ответ от СЕРВЕРА - Завершает сеанс связи  
10 Скелет телефона 00:03:37
1 тест
11 чел. ★ 5 Done
  На этом коротком слайде мы создадим метод calculate() и очень быстро набросаем скелет класса Phone, используя возможности кодогенерации Intellij Idea.
Отчёт отправил: 17947. Dmitry Sinitsin Выполнено за 35 мин. [Показать отчёт]
Научился: ALT + Enter - варианты решения проблемы в выпадающем меню Работа над ошибками: 1. Самостоятельно создав метод calculate в аргументах не указал тип данных у operation - ошибка не уходила, пока не увидел в этом уроке ответ на свою ошибку 2. Не распарсил в Integer переменные a и b 3. Пытался в дефолтный кейс вбить case default - так не надо делать - там просто дефолт пишется, без кейса ALT+ENTER выпадающим меню позволяет создавать не созданные ещё, но уже указанные в коде, КЛАССЫ, МЕТОДЫ, КОНСТРУКТОРЫ! 
11 Универсальный сокет 00:15:27
11 чел. ★ 5 Done
  На этом слайде мы создадим все методы универсального сокета в классе Phone.
Протестируйте программу в разных режимах.

Придумайте, какую ещё клиент-серверную программу можно написать.
Отчёт отправил: 17947. Dmitry Sinitsin Выполнено за 1 час. 27 мин. [Показать отчёт]
Научился: объявили в классе Phone сервер и клиент, буферизированный приёмник данных reader и передатчик writer Первый конструктор Phone (тот, у которого лишь один аргумент - порт) -  создаёт серверный сокет. При создании экземпляра серверного сокета в аргументы передаётся порт в виде строки, поэтому его парсим в целое число методом Integer.parseInt() ALT + ENTER - добавили трайкеч для отлова ошибок Конструктор клиентского экземпляра сокета принимает уже два аргумента - сетевой адрес и номер порта IntellijIDEA позволяет добавлять аргументы при запуске программы через пункт Edit Configuration - выпадающее меню у кнопки запуска с названием класса Необходимости в добавлении \r в моём случае не было. Как в видео - в одну строку у меня не выводило при отсутствии \r и указанной лишь \n И так и эдак перенос строки выполнялся успешно CTRL + C - остановка Сервера в командной строке Звездочка, используемая в качестве аргумента "умножение" должна быть заключена в скобки, иначе она воспринимается командной строкой как знак "ВСЕ" 
12 ФИНАЛЬНЫЙ УРОК без видео
1 тест
11 чел. ★ 5 Done
  Оставьте отзыв об этом миникурсе и отчитайтесь за самостоятельное задание.
Отчёт отправил: 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 FREE VIP. Многопоточность 00:11:34
10 чел. ★ 4.6 Done
  На этом слайде мы поговорим о многопоточности, рассмотрим несколько примеров, кода имеет смысл разделять задачу на потоки, а когда нет. На следующих слайдах мы напишем простой многопоточный сокет для сервера на языке Java
Отчёт отправил: 17947. Dmitry Sinitsin Выполнено за 34 мин. [Показать отчёт]
Научился: два примера многопоточности - эффективный и нет: бортпроводники в салоне самолета за работой - эффективно Более двух пилотов в кабине самолета - неэффективно (КВС и второго пилота более чем достаточно для успешного полёта, дополнительные ПИЛОТЫ не добавляют функциональности авиасудну) Многопоточность неактуальна в случае перевозки одного пассажира. Для перевозки одного пассажира требуется одно транспортное средство. Если предоставить пассажиру более одного ТС, ему от этого легче не станет - на двух поездах одновременно не уедешь Многопоточность крайне полезна в работе диспетчеров Московского Авиаузла. Нагрузка прибывающих регулярных рейсов велика, вылетающих не меньше - распараллеливание работы сопровождения трафика повышает скорость обслуживания и безопасность Многопоточный доступ к серверу полезен при организации модемного пула - чем больше модемов готовых к входящим подключениям и не встречающих звонки сигналами BUSY BUSY!!! повышает доступность сервера и радует клиентов Модем один - а клиентов тьма (обратная картина) - один обслуживается, для остальных при попытке дозвониться - ЗАНЯТО - неэффективно, недовольны все, кроме первого подключившегося 
Видеообзор: wjx77MQL35E
14 VIP. Два потока 00:10:49
1 тест
9 чел. ★ 5 Done
  На этом слайде мы создадим простейшую программу с двумя потоками.
Отчёт отправил: 17947. Dmitry Sinitsin Выполнено за 2 час. 29 мин. [Показать отчёт]
Научился: для создания потока а) наследуем от Thread (extends Thread) или б) имплементируем Runnable (implements Runnable) Метод run запускает отдельный поток sleep(), wait() снижают нагрузку на процессор, создавая паузы выполнения инструкций в коде Для создания нового отдельного потока создаётся новый экземпляр класса Thread с передачей ему аргументом экземпляра first из класса Workerа имплементированного от Runnable Чтобы ограничить доступ к методам, и позволить только одному потоку менять данные там в какой-либо момент времени, мы используем ключевое слово synchronized. Synchronized  позволяет заблокировать доступ к методу или части кода, если его уже использует другой поток. 
15 VIP. Синхрофазатрон 00:14:00
9 чел. ★ 5 Done
  На этом слайде мы создадим коллизию и узнаем, как от неё избавиться.
Отчёт отправил: 17947. Dmitry Sinitsin Выполнено за 32 мин. [Показать отчёт]
Научился: volatile - применяется для моментального чтения переменных, минуя кеширование synchronized - добавляем в сигнатуру метода, когда надо, чтобы к нему в один момент времени имел доступ один процесс, а не более одного! Пауза обусловлена уникальным доступом к методу слип для всех пяти потоков, как я понял 
16 VIP. Функциональное потокообразование 00:04:52
2 теста
9 чел. ★ 5 Done
  На этом коротком слайде мы узнаем, как создать поток через функциональное программирование.
Отчёт отправил: 17947. Dmitry Sinitsin Выполнено за 25 мин. [Показать отчёт]
Научился: Лямбда == набор инструкций выделяемых в отдельную переменную и затем многократно вызываемую в различных местах Лямбда-оператор это стрелка -> Оператор разделяет лямбда-выражение на две части: левая - список параметров выражения правая это тело лямбда-выражения, где выполняются все действия 
17 VIP. Мультики на сервере 00:22:02
1 тест
9 чел. ★ 5 Done
  На этом слайде мы встроим многопоточность в клиент-серверную программу Socketor и продемонстрируем достигнутый эффект.
Отчёт отправил: 17947. Dmitry Sinitsin Выполнено за 16 час. 15 мин. [Показать отчёт]
Научился: при добавлении метода sleep необходимо позаботиться о трайкече с InterruptedException Каждый клиент ждёт обработки с ожиданием 7 секунд предыдущего клиента, и лишь после завершения обработки того, получает доступ к Серверу для своего подключения. Паравозиком идут клиенты, как вагончики, не перепутываются. Порт для всех один, двое сразу не подключатся. Второй phone на тот же порт зацепить не получится - порт уже занят! Реализовали в Phone конструктором создание каждому клиенту своего серверного сокета - ЭТО ПЕРЕШЛИ К МНОГОПОТОЧНОМУ ВАРИАНТУ ALT + INSERT - создание конструктора в контексте При созданных разных потоках у каждого клиента, обработка математическихЪ примеровЪ пошла по принципу - все на батьку! 
Видеообзор: phyUD1liUwk
18 VIP. Динамичная многопоточность 00:30:24
9 чел. ★ 5 Done
  На этом заключительном видеоуроке мы познакомимся с другим способом создания многопоточного сервера.
Если на предыдущем уроке у нас "крутилось" несколько копий одной программы,
то теперь мы будем создавать новый поток при каждом подключении клиента.

Сравните оба варианта и напишите в отчёте, какой подход вам больше понравился и почему.
Отчёт отправил: 17947. Dmitry Sinitsin Выполнено за 2 час. 20 мин. [Показать отчёт]
Научился: в предыдущем уроке количество копий программы параметризировалось числом из аргументов при запуске сервера, и эти копии ожидали подключений как кассы с кассирами во всеоружии в супермеркато Сокеты в прошлом уроке копировались (создавались копии программы) в количестве из аргумента запуска сервера 10 минута видео - гвоздь программы при создании лямбда оператора ))) "Здесь мы пишем вот такую вот фигулинку..." %time:~6,2% выбрать (взять) с шестого индекса два символа %time:~9,2% выбрать (взять) с девятого индекса два символа Динамическое создание сокетов выглядит интереснее своей гибкостью. 
  Итого:   18 видеоуроков 3 час. 22 мин.
15 тестов
9 чел. ★ 4.96  
  Финалисты:   Yefim,   Chip,   Иван Воронин,   Tekashnik,   Александр,   vip,   Айдар,   Dmitry Sinitsin,   Anatoli .

Начинаем практику по языку C#





Если вы пришли без приглашения -
введите тысяча двадцать четыре (цифрами).
Чтобы стать хорошим программистом — нужно писать программы. На нашем сайте очень много практических упражнений.

После заполнения формы ты будешь подписан на рассылку «C# Вебинары и Видеоуроки», у тебя появится доступ к видеоурокам и консольным задачам.

Несколько раз в неделю тебе будут приходить письма — приглашения на вебинары, информация об акциях и скидках, полезная информация по C#.

Ты в любой момент сможешь отписаться от рассылки.


Научился: Уже изучал ранее сокеты, всё-равно было интересно. Курс классный, рекомендую его всем для прохождения!
Трудности: Заплатил за этот отзыв 50 байт. Идём дальше!



Научился: Клиентский метод .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