undefined

Большая задача: Пишем чат на Java

Java Multithreading
6 уровень , 15 лекция
Открыта

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

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

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

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

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

— Скайп?

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

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

— Если будешь точно выполнять команды агента 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)
Итак, подведем итог: • Ты написал сервер для обмена текстовыми сообщениями. • Ты написал консольный клиент, который умеет подключаться к серверу и обмениваться сообщениями с другими участниками. • Ты написал бот клиента, который может принимать запросы и отправлять данные о текущей дате и времени. •
Комментарии (272)
Чтобы просмотреть все комментарии или оставить свой,
перейдите в полную версию
Алексей 31 уровень, Красноярск
14 апреля 2021
Хорошая статья о сокетах на примере простого чата тыц Перед тем, как начинать решать задачу, рекомендую прочесть. И еще отличная статья по MVC здесь. После её прочтения как-то все в голове сложилось.
Евгений 37 уровень, Коряжма
10 апреля 2021
Топовая задача! Реально лучшая из пройденных
Jh-007 34 уровень, Kansk-City
10 апреля 2021
валидатор в этой задаче странный. Локально работает задача, не проходит валидатор. Сравниваю тексты решений, различий нет.
Lara 29 уровень, Варшава
2 апреля 2021
Эта задача мне нравится еще до ее решения! Начиталась комментов и уже не могу, как хочу ее решить!!! 😂
Валерий Федотовских 40 уровень, Москва
24 марта 2021
Лучшая задача на курсе!
Булат 32 уровень, Москва
23 февраля 2021
Очень здоровская задача, спасибо. Понятно, что погружать в свинг отдельная небыстрая песня, тут сталкиваемся уже с готовым кодом, который отрабатывает как магия, и ты делаешь себе заметку разобраться с этим потом... В любом случае это был мой первый раз с гуи так сказать)) Теперь не консолецелка, ае
Илья 29 уровень, Дзержинск
18 февраля 2021
Пожалуй это самый классный проект! Спасибо! Однако есть немного горечи, которая заключается в осознании того, что имеющихся знаний (усвоенной информации) явно не хватит, чтобы написать что-то подобное самостоятельно. Думаю куда продуктивнее было бы обучение в виде пошагового изучения возможностей java (здесь мало претензий к JR), а в качестве итогового задания - написание программы САМОСТОЯТЕЛЬНО. Т.е. есть т/з, есть, например, рекомендации в порядке написания кода / проектирования программы (при этом с обязательным объяснением почему нужно делать так, а не иначе, чтобы у обучающихся формировалось необходимое мышление) и небольшие куски кода в качестве примеров для реализации той или иной части программы. И крутись как хочешь. А так это больше похоже на попытку обучения вождению автомобиля сидя на ручках у инструктора, который позволяет тебе время от времени крутить рулем в пустом поле и иногда побибикать. Так и придётся всё изучать самому!
Slaby 35 уровень, Краснодар
31 января 2021
А как из консоли запустить такой проект? В условиях сервера не будет IDEA с зеленой кнопочкой. Пробовал через java Server и java Client из разных директорий — толку нет. Вывод в консоль А вообще задача — супер! Решая ее, я в полной мере осознал, зачем столько времени корпел на перекладыванием переменных и вызовом методов.
Иван 31 уровень, Москва
26 января 2021
То чувство, когда умеешь работать с библиотекой swing, но не знаешь её
Daniil kukushkin 30 уровень
23 января 2021
Потерял связь после добавления GUI классов. Такое ощущение что уже и класс Client Не нужен. Но от него же контроллер наследуется. Как консольный клиент работает вроде более менее понятно, а вот как GuiView связан через контроллер со всем этим тяжело проследить, закипать начинает. Я так понимаю, это надо получше изучить паттерн MVC?