Всем привет!
Хочу поделиться своим небольшим проектом:
Взял одну из больших задач (Чат) и изменил, обновил, добавил много нового и вот что из этого вышло:
Что изменено/добавлено по сравнению с оригинальной задачей:
- Конфигурацию читает из файла properties при помощи класса ResourceManager
- Добавлены чат румы и возможность клиенту создавать свои чаты
- Добавлены приватные сообщения
- Полностью новый swing интерфейс клиента
- Добавлены горячие клавиши для отправления сообщений и команд клиента
- Добавлено окно настроек
- Добавлены смайлики
- Сделаны вкладки для отображения сообщений из разных чат румов и приватных чатов
- Добавлен счетчик непрочитанных сообщений
- Сделано дерево пользователей для отображения пользователей в чатах и вызова приватных сообщений
- Бот научился отвечать смайликом на смайлик
- Добавил логгер log4j
- Добавил добавил тесты jUnit
- Завернул все это в мавен и разбил на модули
ссылка на гит хаб: https://github.com/DevCorvette/chat
Кому интересно, заходите, смотрите, комментируйте, буду рад :)
Конструктивной критике тоже буду рад.
P.S.: Тот кто еще не решал задачу - не ищите у меня готовых решений, там практически все переписано ;)

ПЕРЕЙДИТЕ В ПОЛНУЮ ВЕРСИЮ
и тогда сразу еще вопрос: почему бы класс Client не сделать интерфейсом и вынести туда все необходимые методы для любой реализации интерфейса. чтоб если я например захочу написать свою реализацию клиента (например веб-клиент) — у меня не были бы связаны руки наследованием класса Client, а я смог бы наследоваться от любого другого класса, и просто реализовать недостающие методы. в том числе и те, которые выводят сообщения об ошибках (потому что сейчас они просто сыпятся в консоль, как я понял, а с веб-клиентом никто ту консоль не увидит. ну кроме сисадмина, который потом будет читать логи веб-сервера) :)
Сообщения об ошибках о которых нужно знать пользователю выводятся через метод showErrorMessage, его можно переопределить. (В классе GUIClient он переопределен) Логи же выводятся в консоль и в файл адрес которого прописывается в файле log4j.properties (сейчас адрес файла C:\Temp\chat_log.log) на сколько я понимаю это правильный подход.
В моей реализации класс Client — это контроллер, а модуль guiclient это отображение и модель вместе.
А это какой-то херов изврат и говнокод. Не советую так больше делать. И не советую двигаться в этом направлении. Лучше получше изучите MVC или какое-нибудь трёх-тировое приложение.
я немножко о другом. допустим есть компания, которой очень понравился ваш чат :) они себе даже специально закупили сервачек именно под чат. и хотели бы сделать примерно так:
общий чат для всех, и клиентов и сотрудников (ну допустим)
общий чат сотрудников
и отдельный чат для руководства и всякой там ылиты))
вот не нравятся им комнаты, хотят реально чтоб разные приложения для этого были.
а на серваке на своем могут только один инстанс сервера поднять потому что он на статиках. ну это грубый пример, конечно, но я вот именно что-то такое имел ввиду :)
а вот их, раз уж они для всех клиентов одинаковые — в контроллер типа :) или даже просто в какой-нибудь отдельный класс статическими методами, если они уже полностью написаны и переопределять их нет необходимости.
да, системные сообщения логично писать в лог, тут абсолютно согласен :) просто я не очень вникал в код. так, на гитхабе просто поклацал классы посмотрел :)
в общем, я примерно так представлял бы такую программу:
в качестве контроллера — то, что у вас в классе Client. он бы обрабатывал подключения клиентов ну и вся бизнес-логика, так сказать, была бы в нем. моделью бы выступали данные, которые он получает/отправляет с сервера. и еще один отдельный класс, который бы имплементировал какой-нибудь интерфейс (с теми несколькими методами, типа, отображать сообщения и список пользователей), и этот класс уже именно работал бы со всеми теми JTabbedPane и JTree и просто «рисовал» бы данные, которые он получил от контроллера.
в таком случае было бы намного проще расширять ваше приложение другим людям, которые например хотели бы написать свой внешний вид (ну там другой фон, другие смайлики, кнопочки, другое расположение панелей). тогда достаточно было бы переопределить те 3 метода типа showMessage(), showUsers(), showErrorMessage() и все. а все остальное пусть делают