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

— Здравия желаю, Капитан Бобров!

— Нам нужен альтернативный канал общения на случай форс-мажора.

— Вы что-то не договариваете, какого еще форс-мажора?

— У нас, в отличии от гражданских, всегда должен быть запасной канал связи.

— Скайп?

— Это слишком не надежно, у нас нет контроля над их серверами. Мы напишем свой чат со своим блэкджеком, вернее сервером и клиентами!

— А там будет графический интерфейс?

— Если будешь точно выполнять команды агента Intellij IDEA, то будет и графический интерфейс.

— Ух ты, наконец-то! Можно еще вопрос?

— Слишком много вопросов. Бонусом получаешь задание написать бота, который будет отвечать на твои вопросы. Приступить к выполнению задания!

— Есть!

Большая задача: Пишем чат на Java - 1
undefined
8
Задача
Java Multithreading, 6 уровень, 15 лекция
Недоступна
Чат (1)
Сегодня мы напишем чат. Набор программ с помощью которого можно будет обмениваться текстовыми сообщения. Набор будет состоять из одного сервера и нескольких клиентов, по одному для каждого участника чата. Начнем с сервера. Нам понадобятся такие классы: 1) Server – основной класс сервера. 2) Message
undefined
14
Задача
Java Multithreading, 6 уровень, 15 лекция
Недоступна
Чат (2)
Первым делом, для удобства работы с консолью реализуем класс ConsoleHelper. В дальнейшем, вся работа с консолью должна происходить через этот класс. Добавь в него: 1) Статическое поле типа BufferedReader, инициализированное с помощью System.in. 2) Статический метод writeMessage(String message), кот
undefined
8
Задача
Java Multithreading, 6 уровень, 15 лекция
Недоступна
Чат (3)
Прежде, чем двигаться дальше, нужно разработать протокол общения клиента и сервера. Сформулируем основные моменты протокола: - Когда новый клиент хочет подсоединиться к серверу, сервер должен запросить имя клиента. - Когда клиент получает запрос имени от сервера он должен отправить свое имя серверу
undefined
8
Задача
Java Multithreading, 6 уровень, 15 лекция
Недоступна
Чат (4)
Сообщение Message – это данные, которые одна сторона отправляет, а вторая принимает. Каждое сообщение должно иметь тип MessageType, а некоторые и дополнительные данные, например, текстовое сообщение должно содержать текст. Т.к. сообщения будут создаваться в одной программе, а читаться в другой, удоб
undefined
28
Задача
Java Multithreading, 6 уровень, 15 лекция
Недоступна
Чат (5)
Клиент и сервер будут общаться через сокетное соединение. Одна сторона будет записывать данные в сокет, а другая читать. Их общение представляет собой обмен сообщениями Message. Класс Connection будет выполнять роль обертки над классом java.net.Socket, которая должна будет уметь сериализовать и десе
undefined
28
Задача
Java Multithreading, 6 уровень, 15 лекция
Недоступна
Чат (6)
Приступим к самому важному – написанию класса Server. Сервер должен поддерживать множество соединений с разными клиентами одновременно. Это можно реализовать с помощью следующего алгоритма: - Сервер создает серверное сокетное соединение. - В цикле ожидает, когда какой-то клиент подключится к сокету.
undefined
14
Задача
Java Multithreading, 6 уровень, 15 лекция
Недоступна
Чат (7)
Т.к. сервер может одновременно работать с несколькими клиентами, нам понадобится метод для отправки сообщения сразу всем. Добавь в класс Server: 1) Статическое поле Map<String, Connection> connectionMap, где ключом будет имя клиента, а значением - соединение с ним. 2) Инициализацию поля из п.7.1 с
undefined
28
Задача
Java Multithreading, 6 уровень, 15 лекция
Недоступна
Чат (8)
Класс Handler должен реализовывать протокол общения с клиентом. Выделим из протокола отдельные этапы и реализуем их с помощью отдельных методов: Этап первый – это этап рукопожатия (знакомства сервера с клиентом). Реализуем его с помощью приватного метода String serverHandshake(Connection connection)
undefined
14
Задача
Java Multithreading, 6 уровень, 15 лекция
Недоступна
Чат (9)
Этап второй, но не менее важный – отправка клиенту (новому участнику) информации об остальных клиентах (участниках) чата. Для этого добавь приватный метод void notifyUsers(Connection connection, String userName) throws IOException,
undefined
14
Задача
Java Multithreading, 6 уровень, 15 лекция
Недоступна
Чат (10)
Этап третий – главный цикл обработки сообщений сервером. Добавь приватный метод void serverMainLoop(Connection connection, String userName) throws IOException, ClassNotFoundException, где значение параметров такое же, как и у метода sendListOfUsers. Он должен: 1) Принимать сообщение клиента 2) Если
undefined
28
Задача
Java Multithreading, 6 уровень, 15 лекция
Недоступна
Чат (11)
Пришло время написать главный метод класса Handler, который будет вызывать все вспомогательные методы, написанные ранее. Реализуем метод void run() в классе Handler. Он должен: 1) Выводить сообщение, что установлено новое соединение с удаленным адресом, который можно получить с помощью метода getRe
undefined
14
Задача
Java Multithreading, 6 уровень, 15 лекция
Недоступна
Чат (12)
Приступим к написанию клиента. Клиент, в начале своей работы, должен запросить у пользователя адрес и порт сервера, подсоединиться к указанному адресу, получить запрос имени от сервера, спросить имя у пользователя, отправить имя пользователя серверу, дождаться принятия имени сервером. После этого кл
undefined
14
Задача
Java Multithreading, 6 уровень, 15 лекция
Недоступна
Чат (13)
Продолжаем реализацию вспомогательных методов класса Client. Добавь в класс методы, которые будут доступны классам потомкам, но не доступны из других классов вне пакета: 1) String getServerAddress() – должен запросить ввод адреса сервера у пользователя и вернуть введенное значение. Адрес может быть
undefined
28
Задача
Java Multithreading, 6 уровень, 15 лекция
Недоступна
Чат (14)
Приступим к написанию главного функционала класса Client. 1) Добавь метод public void run(). Он должен создавать вспомогательный поток SocketThread, ожидать пока тот установит соединение с сервером, а после этого в цикле считывать сообщения с консоли и отправлять их серверу. Условием выхода из цикла будет
undefined
14
Задача
Java Multithreading, 6 уровень, 15 лекция
Недоступна
Чат (15)
Напишем реализацию класса SocketThread. Начнем с простых вспомогательных методов. Добавь методы, которые будут доступны классам потомкам и не доступны остальным классам вне пакета: 1) void processIncomingMessage(String message) – должен выводить текст message в консоль. 2) void informAboutAddingNew
undefined
28
Задача
Java Multithreading, 6 уровень, 15 лекция
Недоступна
Чат (16)
Теперь все готово, чтобы дописать необходимые методы класса SocketThread. 1) Добавь protected метод clientHandshake() throws IOException, ClassNotFoundException. Этот метод будет представлять клиента серверу. Он должен: а) В цикле получать сообщения, используя соединение connection. б) Если тип пол
undefined
8
Задача
Java Multithreading, 6 уровень, 15 лекция
Недоступна
Чат (17)
Последний, но самый главный метод класса SocketThread – это метод void run(). Добавь его. Его реализация с учетом уже созданных методов выглядит очень просто. Давай напишем ее: 1) Запроси адрес и порт сервера с помощью методов getServerAddress() и getServerPort(). 2) Создай новый объект класса java
undefined
14
Задача
Java Multithreading, 6 уровень, 15 лекция
Недоступна
Чат (18)
Иногда бывают моменты, что не находится достойного собеседника. Не общаться же с самим собой :). Давай напишем бота, который будет представлять собой клиента, который автоматически будет отвечать на некоторые команды. Проще всего реализовать бота, который сможет отправлять текущее время или дату, ко
undefined
28
Задача
Java Multithreading, 6 уровень, 15 лекция
Недоступна
Чат (19)
Сейчас будем реализовывать класс BotSocketThread, вернее переопределять некоторые его методы, весь основной функционал он уже унаследовал от SocketThread. 1) Переопредели метод clientMainLoop(): а) С помощью метода sendTextMessage() отправь сообщение с текстом "Привет чатику. Я бот. Понимаю команды
undefined
14
Задача
Java Multithreading, 6 уровень, 15 лекция
Недоступна
Чат (20)
Консольный клиент мы уже реализовали, чат бота тоже сделали, почему бы не сделать клиента с графическим интерфейсом? Он будет так же работать с нашим сервером, но иметь графическое окно, кнопки и т.д. Итак, приступим. При написании графического клиента будет очень уместно воспользоваться паттерном M
undefined
28
Задача
Java Multithreading, 6 уровень, 15 лекция
Недоступна
Чат (21)
У меня есть отличнейшая новость для тебя. Компонент представление (View) уже готов. Я добавил класс ClientGuiView. Он использует библиотеку javax.swing. Ты должен как следует разобраться в каждой строчке этого класса. Если тебе все понятно – это замечательно, если нет – обязательно найди ответы на с
undefined
8
Задача
Java Multithreading, 6 уровень, 15 лекция
Недоступна
Чат (22)
Итак, подведем итог: • Ты написал сервер для обмена текстовыми сообщениями. • Ты написал консольный клиент, который умеет подключаться к серверу и обмениваться сообщениями с другими участниками. • Ты написал бот клиента, который может принимать запросы и отправлять данные о текущей дате и времени. •