Java Chats

Java Chats



💣 👉🏻👉🏻👉🏻 ALL INFORMATION CLICK HERE 👈🏻👈🏻👈🏻

































Java Chats




slowprog

/

java_socket_chat








© 2021 GitHub, Inc.
Terms
Privacy
Security
Status
Docs






Contact GitHub
Pricing
API
Training
Blog
About


Это демонстрационная проект, который ставит своей целью закрепление знаний Java по созданию клиент-серверного приложения с GUI.
В проекте присутсвуют обе части чата:
Серверная часть. Поднимается только на localhost на порту 8189. Не имеет никакого GUI. Её просто нужно запустить первой (перед подключением клиентов).
Внутри есть класс для проверки авторизации BaseAuthService , в который захардкожены несколько логинов для подключения клиентов. В рамках данного проекта работа с базой данных не предусматривалось, а потом было решено сделать так. Пры логин-пароль для авторизации: login1 и pass1, login2 и pass2, login3 и pass3.
Клиентская часть. Используется для подключения к серверу на localhost на порту 8189. GUI написан на JavaFX.
Первое, что отображается при запуске клиента – это окно авторизации (первая вьюшка), где нужно вбить одну из пар логин-пароль упомянутую выше. После этого становится доступным основной интерфейс чата (вторая вьюшка) со следующими фичами:
Чат далеко не идиален и его можно долго ещё допиливать:
Но так или иначе, как бы мне не было стыдно за этот "проект", свою задачу приложение выполнело: с JavaFX работать научился и простое клиент-серверное приложение писать научился.

Простой сетевой чат на Java [GeekBrains] - YouTube
GitHub - slowprog/ java _socket_ chat : Чат на Java с GUI'ём на JavaFX
Курс Java Multithreading - Лекция: Пишем свой чат на Java
How to Create a Chat Console Application in Java using Socket
Open source сервер онлайн- чатов на Java / Хабр
6
уровень
,
15
лекция
Java Multithreading, 
6
уровень, 
15
лекция

Сегодня мы напишем чат. Набор программ с помощью которого можно будет
обмениваться текстовыми сообщения. Набор будет состоять из одного сервера и
нескольких клиентов, по одному для каждого участника чата.

Начнем с сервера. Нам понадобятся такие классы:
1) Server – основной класс сервера.
2) Message
Java Multithreading, 
6
уровень, 
15
лекция

Первым делом, для удобства работы с консолью реализуем класс ConsoleHelper. В
дальнейшем, вся работа с консолью должна происходить через этот класс.

Добавь в него:
1) Статическое поле типа BufferedReader, инициализированное с помощью System.in.
2) Статический метод writeMessage(String message), кот
Java Multithreading, 
6
уровень, 
15
лекция

Прежде, чем двигаться дальше, нужно разработать протокол общения клиента и сервера.

Сформулируем основные моменты протокола:
- Когда новый клиент хочет подсоединиться к серверу, сервер должен запросить имя
клиента.
- Когда клиент получает запрос имени от сервера он должен отправить свое имя серверу
Java Multithreading, 
6
уровень, 
15
лекция

Сообщение Message – это данные, которые одна сторона отправляет, а вторая принимает.
Каждое сообщение должно иметь тип MessageType, а некоторые и дополнительные
данные, например, текстовое сообщение должно содержать текст. Т.к. сообщения будут
создаваться в одной программе, а читаться в другой, удоб
Java Multithreading, 
6
уровень, 
15
лекция

Клиент и сервер будут общаться через сокетное соединение. Одна сторона будет
записывать данные в сокет, а другая читать. Их общение представляет собой обмен
сообщениями Message. Класс Connection будет выполнять роль обертки над классом
java.net.Socket, которая должна будет уметь сериализовать и десе
Java Multithreading, 
6
уровень, 
15
лекция

Приступим к самому важному – написанию класса Server. Сервер должен поддерживать
множество соединений с разными клиентами одновременно. Это можно реализовать с
помощью следующего алгоритма:
- Сервер создает серверное сокетное соединение.
- В цикле ожидает, когда какой-то клиент подключится к сокету.
Java Multithreading, 
6
уровень, 
15
лекция

Т.к. сервер может одновременно работать с несколькими клиентами, нам понадобится
метод для отправки сообщения сразу всем.

Добавь в класс Server:
1) Статическое поле Map connectionMap, где ключом будет имя
клиента, а значением - соединение с ним.
2) Инициализацию поля из п.7.1 с
Java Multithreading, 
6
уровень, 
15
лекция

Класс Handler должен реализовывать протокол общения с клиентом.
Выделим из протокола отдельные этапы и реализуем их с помощью отдельных методов:
Этап первый – это этап рукопожатия (знакомства сервера с клиентом). Реализуем его с
помощью приватного метода String serverHandshake(Connection connection)
Java Multithreading, 
6
уровень, 
15
лекция

Этап второй, но не менее важный – отправка клиенту (новому участнику) информации об остальных клиентах (участниках) чата.

Для этого добавь приватный метод void notifyUsers(Connection connection, String userName) throws IOException,
Java Multithreading, 
6
уровень, 
15
лекция

Этап третий – главный цикл обработки сообщений сервером.
Добавь приватный метод void serverMainLoop(Connection connection, String userName) throws
IOException, ClassNotFoundException, где значение параметров такое же, как и у метода
sendListOfUsers.

Он должен:
1) Принимать сообщение клиента
2) Если
Java Multithreading, 
6
уровень, 
15
лекция

Пришло время написать главный метод класса Handler, который будет вызывать все
вспомогательные методы, написанные ранее. Реализуем метод void run() в классе Handler.

Он должен:
1) Выводить сообщение, что установлено новое соединение с удаленным
адресом, который можно получить с помощью метода getRe
Java Multithreading, 
6
уровень, 
15
лекция

Приступим к написанию клиента. Клиент, в начале своей работы, должен запросить у
пользователя адрес и порт сервера, подсоединиться к указанному адресу, получить запрос
имени от сервера, спросить имя у пользователя, отправить имя пользователя серверу,
дождаться принятия имени сервером. После этого кл
Java Multithreading, 
6
уровень, 
15
лекция

Продолжаем реализацию вспомогательных методов класса Client.

Добавь в класс методы, которые будут доступны классам потомкам,
но не доступны из других классов вне пакета:
1) String getServerAddress() – должен запросить ввод адреса сервера у
пользователя и вернуть введенное значение. Адрес может быть
Java Multithreading, 
6
уровень, 
15
лекция

Приступим к написанию главного функционала класса Client.

1) Добавь метод public void run(). Он должен создавать вспомогательный поток
SocketThread, ожидать пока тот установит соединение с сервером, а после этого
в цикле считывать сообщения с консоли и отправлять их серверу. Условием выхода
из цикла будет
Java Multithreading, 
6
уровень, 
15
лекция

Напишем реализацию класса SocketThread. Начнем с простых вспомогательных методов.

Добавь методы, которые будут доступны классам потомкам и не доступны остальным
классам вне пакета:
1) void processIncomingMessage(String message) – должен выводить текст message в
консоль.
2) void informAboutAddingNew
Java Multithreading, 
6
уровень, 
15
лекция

Теперь все готово, чтобы дописать необходимые методы класса SocketThread.

1) Добавь protected метод clientHandshake() throws IOException,
ClassNotFoundException. Этот метод будет представлять клиента серверу. Он должен:
а) В цикле получать сообщения, используя соединение connection.
б) Если тип пол
Java Multithreading, 
6
уровень, 
15
лекция

Последний, но самый главный метод класса SocketThread – это метод void run(). Добавь
его. Его реализация с учетом уже созданных методов выглядит очень просто.

Давай напишем ее:
1) Запроси адрес и порт сервера с помощью методов getServerAddress() и
getServerPort().
2) Создай новый объект класса java
Java Multithreading, 
6
уровень, 
15
лекция

Иногда бывают моменты, что не находится достойного собеседника. Не общаться же с
самим собой :). Давай напишем бота, который будет представлять собой клиента, который
автоматически будет отвечать на некоторые команды. Проще всего реализовать бота,
который сможет отправлять текущее время или дату, ко
Java Multithreading, 
6
уровень, 
15
лекция

Сейчас будем реализовывать класс BotSocketThread, вернее переопределять некоторые
его методы, весь основной функционал он уже унаследовал от SocketThread.

1) Переопредели метод clientMainLoop():
а) С помощью метода sendTextMessage() отправь сообщение с текстом
"Привет чатику. Я бот. Понимаю команды
Java Multithreading, 
6
уровень, 
15
лекция

Консольный клиент мы уже реализовали, чат бота тоже сделали, почему бы не сделать
клиента с графическим интерфейсом? Он будет так же работать с нашим сервером, но
иметь графическое окно, кнопки и т.д.
Итак, приступим. При написании графического клиента будет очень уместно воспользоваться
паттерном M
Java Multithreading, 
6
уровень, 
15
лекция

У меня есть отличнейшая новость для тебя. Компонент представление (View) уже готов. Я
добавил класс ClientGuiView. Он использует библиотеку javax.swing. Ты должен как следует
разобраться в каждой строчке этого класса. Если тебе все понятно – это замечательно, если
нет – обязательно найди ответы на с
Java Multithreading, 
6
уровень, 
15
лекция

Итак, подведем итог:
• Ты написал сервер для обмена текстовыми сообщениями.
• Ты написал консольный клиент, который умеет подключаться к серверу и
обмениваться сообщениями с другими участниками.
• Ты написал бот клиента, который может принимать запросы и отправлять данные о
текущей дате и времени.

Чтобы просмотреть все комментарии или
оставить свой,
перейдите в полную версию
Slaby
30
уровень, Краснодар




А как из консоли запустить такой проект? В условиях сервера не будет IDEA с зеленой кнопочкой. Пробовал через java Server и java Client из разных директорий — толку нет.
Вывод в консоль

А вообще задача — супер! Решая ее, я в полной мере осознал, зачем столько времени корпел на перекладыванием переменных и вызовом методов.
То чувство, когда умеешь работать с библиотекой swing, но не знаешь её
Daniil kukushkin
30
уровень




Потерял связь после добавления GUI классов. Такое ощущение что уже и класс Client Не нужен. Но от него же контроллер наследуется. Как консольный клиент работает вроде более менее понятно, а вот как GuiView связан через контроллер со всем этим тяжело проследить, закипать начинает. Я так понимаю, это надо получше изучить паттерн MVC?
https://javarush.ru/groups/posts/654-klassih-socket-i-serversocket-ili-allo-server-tih-menja-slihshi...
Где-то задаче на 12 будет полезно почитать. Раньше не особо понятно будет, о чем речь вообще. А так, это будет дополнением к пониманию того, что вы писали все это время
alex_us
41
уровень, Симферополь




Ну конечно тупняки с валидатором все равно раздражают. Например сравнение элементов enum через equals не проходит валидацию. А через == проходит . Разница?
Иван Сибиряков
30
уровень, Санкт-Петербург




Вроде и доволен задачей, но хочется затестить чат в боевых условиях) А как это сделать, к сожалению, пока не знаю.

Но вообще лучшая задача в курсе на данный момент. Только про свинг нам похоже так и не расскажут. Понимаю, что он не очень-то и нужен. Но всё равно обидно
Алексей Мирный
41
уровень, Москва




Щак как напишу чат и буду в нем знакомиться с тёлочками))
Среднее количество попыток у последней задачи 1.01

Кто-то промазал что-ли?
Vladimir “Rain_Senpai1995” Soldatenko
35
уровень, Киев




Несмотря на то, что конткретно такие задачи я ждал, очень трудно запомнить ход действий при реализаци.
©
2021
JavaRush
«Программистами не рождаются»
— Нам нужен альтернативный канал общения на случай форс-мажора.
— Вы что-то не договариваете, какого еще форс-мажора?
— У нас, в отличии от гражданских, всегда должен быть запасной канал связи.
— Это слишком не надежно, у нас нет контроля над их серверами. Мы напишем свой чат со своим блэкджеком, вернее сервером и клиентами!
— А там будет графический интерфейс?
— Если будешь точно выполнять команды агента Intellij IDEA, то будет и графический интерфейс.
— Ух ты, наконец-то! Можно еще вопрос?
— Слишком много вопросов. Бонусом получаешь задание написать бота, который будет отвечать на твои вопросы. Приступить к выполнению задания!

Live Nude Ladies
Asian Wet Pussy Pics
Celestia Vega Cum Show
Ivonne Armant Playboy
Sex Chat Free Video