Я просто дам краткую суть и улучшу ее позже, но здесь идет речь:
Обзор:
Итак, вы сохраняете некоторые детали на сервере, а затем, когдаклиент подключается, он отправляет имя пользователя и пароль и аутентифицируется на основе этих данных.Вы сохраняете конечную точку Socket
на карте, которая является String username -> Socket socket
.Также храните обратное, Socket socket -> String username
.Используйте это, чтобы найти имя пользователя, когда вы получаете что-то из сокета.Даже если вы используете сокетные каналы, вы все равно можете получить сокет из канала, используя канальные методы.
Для управления этими соединениями с NIO:
То, о чем я не говорил, былокак вы получите данные об имени пользователя и пароле.Для этого советую обрамление.Прочитайте размер данных, а затем прочитайте тип данных, который должен быть двумя целыми числами.Вы можете записывать объекты непосредственно в поток сокетов и обрабатывать их в том же порядке на другом конце.
Вам следует использовать селектор с клавишами селектора и сохранять полученные данные в буферах, прикрепленных к этим клавишам выбора.Затем вы просто продолжаете выбирать и добавлять полученные данные в буфер, если сокет доступен для чтения, при попытке обработать буфер.Если в буфере есть полезные данные после записи в него из чтения (т.е. вы получили размер данных, а также полную длину данных), вам необходимо удалить данные и сжать буфер - т.е. переместить буферПоложение вверх на размер длины данных (размер целого) + размер типа данных (размер целого) + длина данных, а затем уменьшите весь лот до 0 и установите позицию в конец текущих полученных данных.Для этого используйте buffer.compact()
.
Я бы действительно посоветовал что-то вроде KryoNet , чтобы выполнить тяжелую работу.Сетевое программирование сложно.Но это может быть для назначения, так что ...