Обнаружение определенного клиента - PullRequest
0 голосов
/ 04 мая 2011

Я разрабатываю приложение для чата. У меня проблема. Как я могу определить конкретного клиента через сервер?

Я использую ServerSocket и Socket классы для общения.

Ответы [ 3 ]

0 голосов
/ 04 мая 2011

Стандартный подход, когда клиент подключается к серверу, заключается в отправке имени пользователя и пароля для идентификации клиента.Если вы хотите, чтобы это было прозрачным, вы можете использовать System.getProperty("user.name"), который прост, но не очень безопасен.

0 голосов
/ 04 мая 2011

Я просто дам краткую суть и улучшу ее позже, но здесь идет речь:


Обзор:

Итак, вы сохраняете некоторые детали на сервере, а затем, когдаклиент подключается, он отправляет имя пользователя и пароль и аутентифицируется на основе этих данных.Вы сохраняете конечную точку Socket на карте, которая является String username -> Socket socket.Также храните обратное, Socket socket -> String username.Используйте это, чтобы найти имя пользователя, когда вы получаете что-то из сокета.Даже если вы используете сокетные каналы, вы все равно можете получить сокет из канала, используя канальные методы.


Для управления этими соединениями с NIO:

То, о чем я не говорил, былокак вы получите данные об имени пользователя и пароле.Для этого советую обрамление.Прочитайте размер данных, а затем прочитайте тип данных, который должен быть двумя целыми числами.Вы можете записывать объекты непосредственно в поток сокетов и обрабатывать их в том же порядке на другом конце.

Вам следует использовать селектор с клавишами селектора и сохранять полученные данные в буферах, прикрепленных к этим клавишам выбора.Затем вы просто продолжаете выбирать и добавлять полученные данные в буфер, если сокет доступен для чтения, при попытке обработать буфер.Если в буфере есть полезные данные после записи в него из чтения (т.е. вы получили размер данных, а также полную длину данных), вам необходимо удалить данные и сжать буфер - т.е. переместить буферПоложение вверх на размер длины данных (размер целого) + размер типа данных (размер целого) + длина данных, а затем уменьшите весь лот до 0 и установите позицию в конец текущих полученных данных.Для этого используйте buffer.compact().

Я бы действительно посоветовал что-то вроде KryoNet , чтобы выполнить тяжелую работу.Сетевое программирование сложно.Но это может быть для назначения, так что ...

0 голосов
/ 04 мая 2011

Используйте getInetAddress() из Socket, чтобы получить адрес клиента.

Socket clientSocket = server.accept();
InetAddress clientAddress = clientSocket.getInetAddress();

Если у вас есть клиенты, уникальные для данного IP-адреса, вы можете сделать clientAddress.getHostAddress(), чтобы получить IP-адрес клиента.

...