Передача через Socket объекта?

Пишу мессенджер(исключительно в качестве практики) и возникла проблема - сейчас он реализован для передачи только строковых данных, но на данном этапе это уже не подходит. На сервер и обратно как минимум хотелось бы передавать целые объекты - например, объект отвечающий за регистрацию(некий класс, который будет хранить нужное количество информации для этой регистрации), отвечающий за вход, за рассылку всем клиентам, за отправку сообщения конкретному пользователю(Нужно передать, как минимум, сообщение и id пользователя, которому буду передавать) ну и так далее. Первая моя мысль - объекты наследников класса "Messеge" которые и будут выполнять эти функции, соответственно массив байт на клиенте, дешифровка на стороне сервера, но мне очень не хотелось бы делать это абы как, хотелось бы сделать так, как это стоило бы сделать, вне зависимости от степени сложности. Возможно стоит вообще передавать JSON-ы и парсить их на сервере? Или что-то еще? рад буду любым ответам, наставлениям, рекомендациям и советам. Собственно, всё пляшет от того, что нижеприведенный метод уже не даёт нужного функционала и вместо public synchronized void sendMessege(String messege) как минимум нужен public synchronized void sendMessege(Object messege), и соответственно новая реализация, осталось выяснить насколько такое решение плохое и/или чем его лучше заменить. Заранее всем спасибо!

public synchronized void sendMessege(String messege){
        /**
         * Метод для отправки сообщений
         */

        try {
            out.write(messege+ "\r\n");
            out.flush();
        } catch (IOException e) {
             listener.sExeption(e);
        }

    }
  • Вопрос задан
  • 3725 просмотров
Решения вопроса 1
jamakasi666
@jamakasi666 Куратор тега Java
Просто IT'шник.
1) Если хочется своего колхоза то имплементируйте в нужный класс интерфейс Serializable, на стороне передачи будет нечто
ObjectOutputStream out ...;
out.writeObject(object);

на стороне приема нечто такое
ObjectInputStream in ...;
YouClass object = (YouClass)in.readObject();

2) Если хочется взять готовенькое то смотри в сторону kryonet, все быстро и просто.
3) Если все же хочется своего но не особо хочется морочиться с сериализацией то смотри protobuf.
4) Еще можно пойти классическим путем. В классе который хотите передавать создаете конструктор с нужными полями, дальше этот класс перегоняете в json\xml\обычным массивом текста с разделителями и передаете строкой, на принимающей строке разбираете эту строку и создаете объект через конструктор. Для автоматизации можно взять к примеру Gson в котором все сведется к такому виду
public static class Entity {
    int id;
    String name;
   //другие типы и данные, если класс то аналогичным образом описываете

    public Entity(int id, String name) {
        this.id = id;
        this.name = name;
    }
}String json = gson.toJson(entity); // {"id":100,"name":"name"}
Entity read = gson.fromJson(json, Entity.class);
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 1
alfss
@alfss
https://career.habr.com/alfss
Предлагаю посмотреть в сторону protobuf. А вообще можно и с помощью json + basе64 обмениваться.
Ответ написан
Комментировать
Ваш ответ на вопрос

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

Войти через центр авторизации
Похожие вопросы
Bell Integrator Ульяновск
До 400 000 ₽
Bell Integrator Хабаровск
До 400 000 ₽
Bell Integrator Ижевск
До 400 000 ₽