• Ошибка с потоками?

    @ruslanys
    PlagueStarScream, напиши мне в скайп. Никнейм такой же.
  • Ошибка с потоками?

    @ruslanys
    PlagueStarScream: Рад был помочь. Обращайся, если будут вопросы.
  • Ошибка с потоками?

    @ruslanys
    PlagueStarScream: > joxi.ru/EA4dBWGCDpMbPA
    Observer и OnMessageListener вынесите в отдельные файлы.
  • Ошибка с потоками?

    @ruslanys
    PlagueStarScream: Ваша ошибка в первую очередь в том, что 2 раза сокеты открывали для чтения\записи. Это неправильно. Сокет - одно соединение, которое содержит как Input, так и Output stream. А у Вас выходит, что в одно соединение Вы пишите сообщения, из другого читаете.

    Также, т.к. операции с InputStream являются блокируемыми, чтобы не повесить все наше приложение в ожидании сообщения по сети, выделяем работу с сокетом в отдельный поток.

    Для сервера это ClientThread, т.е. на каждое подключение\клиента выделяется отдельным Тред, обрабатывающий сообщения клиента.
    Для клиента это WorkerThread, он обслуживает сообщения от сервера. Для того, чтобы сообщения от сервера мог получать и обрабатывать любой компонент клиентской системы, использован Observer. Он позволяет внутренним компонентам системы "подписаться" на получение сообщений из сервера.
    Таким образом, когда WorkerThread получает от сервера сообщение, он адресует его Observer. Observer доставляет уведомления уже всем своим подписчикам. Таким образом мы достигаем слабой связанностью между компонентом WorkerThread и компонентами, реализующими бизнес-логику по обработке сообщений из сервера.

    Как-то так.
  • Ошибка с потоками?

    @ruslanys
    PlagueStarScream: Что именно не работает?
  • Ошибка с потоками?

    @ruslanys
    PlagueStarScream: Это только так кажется. На самом деле мой пример очень простой. Единственное отклонение в том, что я добавил Observer на клиенте. В остальном - не сложнее Вашего примера.
    Как только разберетесь, поймете насколько все просто, логично, лаконично и красиво.
  • Как правильно использовать HashMap?

    @ruslanys
    Maks Burkov: Это может любая среда сгенерировать или тот же Lombok, например.
    Вот пример автогенерации equals/hashCode в Intellij IDEA:
    public class User {
    
        private Long id;
        private final String email;
    
        public User(String email) {
            this(null, email);
        }
    
        public User(Long id, String email) {
            this.id = id;
            this.email = email;
        }
    
        @Override
        public boolean equals(Object o) {
            if (this == o) return true;
            if (o == null || getClass() != o.getClass()) return false;
    
            User user = (User) o;
    
            return email.equals(user.email);
        }
    
        @Override
        public int hashCode() {
            return email.hashCode();
        }
    }


    Суть заключается в том, что Java знает когда, например, строки и числа равны, но не знает в каких случаях равными являются объекты класса User. И эту стратегию необходимо задавать Вам как разработчику этого класса.
    В примере выше я указал, что если у двух объектов User равный email, значит объекты нужно считать равными (equals).
    У равных объектов равен и HashCode. HashCode используется для того, чтобы быстренько проверить потенциально равны объекты или нет, а в equals уже производится проверка полного соответствия.
    Чтобы понять зачем нужен HashCode почитайте про хэш-таблицы ну и вообще про реализацию в Java.
  • Что можно тянуть в одного на Java?

    @ruslanys
    Eugene Aristarhov: Есть SOAP 1.x версии, который, как бы, мертв, но все еще используется. Есть SOAP 2 версии. Но так или иначе, вся эта автогенерация классов по WSDL выглядит крайне убого и отвратительна в использовании, ИМХО. Я так и не нашел инструмента, который бы меня полностью удовлетворял по работе с SOAP из Java.

    Насчет взаимодействия систем согласен полностью, но лучше REST)
  • Что можно тянуть в одного на Java?

    @ruslanys
    Соглашусь. Но я бы из всего этого повествования вырезал страшное слово SOAP :).
  • Как вставить данные в таблицу в Hibernate?

    @ruslanys
    Евгений Сулейманов: `@Data` - это аннотация библиотеки Lombok (https://projectlombok.org/). Проще говоря, чтобы не писать геттеры, сеттеры, конструктор по умолчанию, можно написать `@Data`.
  • Какие есть альтернативы liquibase/flyway с поддержкой откатов миграций?

    @ruslanys
    Мне больше FlyWay нравится. Но вопрос поддерживаю.
  • JavaFx ─ на сколько актуально для детскопного софта?

    @ruslanys
    мы использовали JavaFX 8 в одном из проектов.
    > Можно делать программу с уже упакованной в неё средой исполнения
    К сожалению, с этим есть проблемы на Windows. Так, например, собранная на 64-битной версии программка не будет работать на Windows 32-битной. Ну и все вытекающие: XP против 7, 8, и пр.

    В общем, пакет со средой исполнения нужно собирать точь-в-точь на той ОС, на котором в последующем ПО планируется использовать.
  • Почему не все серверы пишутся на Node js?

    @ruslanys
    un1t: Вообще у меня тоже сомнительно отношение к Node.JS. Но концепутально Вы не правы. Взять тот же MeteorJS - прекрасная штука.
  • Репозиторий Spring Data Jpa блокирует поток при любом запросе?

    @ruslanys
    programmerjava: Да, мы это уже все прошли) Но все новые проекты пишем только на нем. Отличная вещь!
  • Vkontakte, wall.post – error_code 15, Access denied. Что не так?

    @ruslanys
    Это вполне логично. В том-то и суть standalone приложений, что access_token в качестве аргумента может уходить только на https://api.vk.com/blank.html, а ни на какой другой домен. А уже на клиенте вы парсите этот access_token из урла.
  • У JAVA есть будущее?

    @ruslanys
    Дмитрий думаю, что Денис (Denis Verbin) создал свой язык программирования, который определенно лучше Java, именно это ему позволяет так поверхностно и безосновательно утверждать о том, что Java - чудовище.
  • Какой язык программирования выбрать?

    @ruslanys
    Охотно соглашусь. Начинать стоит с Python. На западе его первым делом преподают для того, чтобы можно было легко и быстро решать алгоритмические задачи на языке программирования. Но в случае с выбором основного языка программирования, я бы на твоём месте посмотрел количество вакансий в твоём регионе и среднюю зп за этот язык. Например PHP очень низко оплачивается в большинстве своём. За Python уже платят больше. Самый оптимальный вариант это Java или C#, за эти языки платят практически больше всего + работы на этих языках море.
  • Как написать серверную часть для Android клиента на Java?

    @ruslanys
    nikesport: нет ограничений, это зависит от аппаратной основы сервера. У меня, например, на самом дешёвом VPS (512MB RAM, 1 Core CPU, Ubuntu) Java IO мог обрабатывать ~300 одновременно подключенных пользователей, с Java NIO на этом же сервере был достигнут результат в ~950 одновременно подключенных пользователей.
  • Как написать серверную часть для Android клиента на Java?

    @ruslanys
    Я тебе все таки советую взять фреймворк Netty и на базе него построить взаимодействие между клиентом и сервером путём передачи объектов. В Netty есть сериализация объектов Java "из коробки". Это значит, что ты можешь даже не заморачиваться с типом передаваемых сообщений, просто сделай класс Packet, расширь его под свои нужды и все, будешь кидать его между клиентом и сервером. Я ещё обычно в этом классе делал заголовок, чем выступал enum. Можешь, конечно, сделать передачу объекта в JSON, но тебе придется тратить время на то, чтобы написать собственную сериализацию/десериализацию в/из JSON. НО! Я все таки рекомендую использовать фреймворк. Есть такой важный момент: в Java IO ты однозначно по завершению получишь сообщение, а вот в Java NIO ты можешь получить лишь часть сообщения, если канал плохой и тебе нужно читать канал до тех пор, пока не получишь символ окончания пакета. Короче это длительный разговор, используй фреймворк)))) Я на этом уже собаку съел)) Чтобы тебе не повторять моих ошибок, рекомендую воспользоваться моими советами)
  • Как написать серверную часть для Android клиента на Java?

    @ruslanys
    Это тебе нужно почитать про Java Channel и передачу данных по каналу. Все не так просто. В Java IO у тебя на 1 подключение 2 потока: входящий/исходящий. А случае с Java NIO, там оба эти потока заменены на 1 канал. То есть этот канал является общим для клиента и сервера. Это значит, что им нужно различать где чье сообщение. В случае с методом reset() - он сбрасывает маркер позиции на 0. Почитай про Java NIO, там это все порой хорошо описывается. Скинул бы ссылку, но ещё не добрался до работы.