Задать вопрос

Чат на Java (Интерфейс клиента на JavaFX), как сделать?

Делаю чат , с регистрацией и авторизацией( опыта работы на Java нету).
Вопрос первый : Как лучше сделать отправку объекта от клиента к серверу? Не надо слишком замудренно . Хотел сначала сделать преобразованием объекта в xml , потом его преобразовывать в строку и отправлять на сервер , а на сервере уже "вытаскивать" объект из xml . Все вроде хорошо шло , на сервер строка приходила , даже мог вывести ее куда то , но в объект не хочет преобразовываться она , хотя это xml код( Лазил везде , но ничего не помогает , если надо будет , то кину пример когда , как я это делаю). Если я все таки не правильно делаю , то подскажите как лучше делать. Какую сериализацию лучше использовать и как отправлять сериализованный объект на сервер.
Вопрос второй : Пока не решил , как точно буду делать , или общий чат , или что бы клиенты могли чатиться между собой , или даже создавать группы(комнаты) . Но вопрос другом , Вот Логин и Пароль будут храниться в бд . Но я бы еще хотел сделать , что бы была история сообщений , а не чисто каждый раз чат с нуля у каждого клиента . Так вот такой вопрос: Как вообще сохранять переписку , в бд или как то можно еще , например в файлах может каких то на самом сервере( Это моя догадка) .
Если не сложно , то помогите , чат делаю чисто для себя , и напомню , что Java занимаюсь недавно . Простой чат уже делал и разбирал , который работал как эхо-сервер , когда один пользователь отправлял сообщение и это сообщение отправлялось остальным пользователям .
P.S. Делаю на сокетах.
  • Вопрос задан
  • 3522 просмотра
Подписаться 3 Простой 6 комментариев
Решения вопроса 1
jamakasi666
@jamakasi666 Куратор тега Java
Просто IT'шник.
Вот уже второй вопрос задаете и все такойже бестолковый.
Во первых причем тут javafx вообще? Это вообще ui и никаким боком и уж темболее сложностей просто по определению быть не может ну вообще никак и никаким боком.
Во вторых, абсолютно, подчеркиваю АБСОЛЮТНО, все что должно волновать на данный момент это архитектура. И начать НУЖНО именно с нее, сядьте, возьмите просто клочок бумаги и напишите пунктами в столбик что необходимо от чата, вот прям все что вы от него хотите, отчертите линию и справа также столбиком сгрупируйте хотелки по их смыслу, дальше уже для полученных групп справа написать псевдокод , что будет использоваться для этой фичи и какие типы данных будут ходить. Подобное я приводил уже в предудщем вашем вопросе но так и быть накидаю еще и тут пример.
В третих, на тостер приходить надо уже с конкретной проблемой да еще и с которой нагуглить ничего не удалось, что то типа вот у меня сериализация, вот метод сериализация, вот десериализации, а вот ошибка и немогу понять почему.

По второму пункту пример
Хочу | Объединение схожего | Как сделать
----------------------------------------------------------------------------------------------------------------
1 чат с другом | 1 | Формат (кому, откого, сообщение)
2 история | 2 | Хранить в sql бд форматом сообщений
3 чат со всеми | 1 | Формат (от кого, сообщение)
4 чат со всеми но в комнате | 1 | Формат (от кого, комната, сообщение)
5 авторизация | 3 | хранить в sql базе, передавать Форматом(логин, пароль)
6 общение клиент сервер | | Текстовый вид, Json
7 регистрация | 3 | хранить в sql , передавать Форматом(логин, пароль)
n

По результату берешь и систематизируешь уже конкретнее типа такого:
1) Нарисовалось много разных форматов сообщений и надо их както отличать а значит сделаю класс родителя с полем int которое будет хранить тип сообщения. Проблема обмена информацией между клиентом и сервером решена полностью с обеих сторон.
abstract class AMessage{
int messType;
}

2) Необходим универсальный метод сериализации и десериализации объектов из\в json. Возьму библиотеку gson, почитав ее доки получился вот такой простой способ без колхоза. Проблема полностью решена.
public <T> T fromJson(String json, Class<T> classOfT){
        Gson gson = new GsonBuilder().create();
        try{
            return gson.fromJson(json, classOfT);
        }catch(JsonSyntaxException jse){
            return null;
        }
    }
    public String toJson(Object obj){
        Gson gson = new GsonBuilder().setPrettyPrinting().create();
        try{
            return gson.toJson(obj);
        }catch(JsonSyntaxException jse){
            return null;
        }
    }

3) Надо назначить и написать классы для каждого сообщения
Для сообщения в комнату будет так
//от кого, комната, сообщение
class RoomMessage extends AMessage{
String from;
String roomName;
String message;
RoomMessage(String from, String roomName, String message){
 this.messType = 10;
 this.from = from;
 this.roomName = roomName;
 this.message = message;
}
}

n - такой будет класс регистрации и т.д.

Шаг n.

Вот только теперь начинаешь писать код. Причем при написании идешь по всем шагам и только так как описал это ранее, даже если в процессе реализации это оказалось сложно\криво\глупо\неправильно.

Программирование на самом деле состоит процентов на 90 из вот такой волокиты с написанием на бумаге всего и вся и только из 10% реализации. Кроме того таким способом все получится сделать очень быстро, логично и понятно, будет очень легко искать ошибки в программе и дебажить ее. Кроме того еще и получишь сразу почти готовую документацию которую останется только причесать и можно будет показать другому кодеру и он сразу въедет что тут и как работает. А вот заниматься написанием кода "эмпирическим" путем всегда тупиковое дело в котором будешь буксовать на месте, постоянно забывать что тут и как а главное зачем и почему неработает.

ps еслибы я был преподавателем, а Вы студентом, надавал бы по заднице и вообще заставил вместо такой работы при мне писать от и до всю логику програмки на бумаге а затем рассказывать зачем и почему так сделал.
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 1
Lure_of_Chaos
@Lure_of_Chaos
Программист
Как лучше сделать отправку объекта от клиента к серверу?

Смотря как сделан сервер. Можно, например, использовать старые добрые сокеты и ObjectOutputStream\ObjectInputStream. Или, если сервер понимает HTTP (скажем, использован какой-нибудь Spring WebMVC\WebFlux), то использовать Apache HTTP Components или что-то похожее.
Но вопрос другом

В чем?
Как вообще сохранять переписку

Лучше всего, конечно, использовать БД - проще делать выборки, чем из файлов.

А в целом, раз уж
Простой чат уже делал

так сделайте все то же самое, только на Java, сложность тут не в использовании платформы, а именно в продумывании архитектуры.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы