Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Java: Работа с сетью > Идентификация пользователя по сокетам


Автор: JoGi 25.2.2006, 03:04
Добрый день,

Я тут с такой проблемкой столкнулся... На стороне клиента имеется апплет, который коннектится к серверу. На сервере такой код:

Код

clientSocket = serverSocket.accept();
clients.add(clientSocket);


То есть, имеется вектор активных клиентов. Допустим, адрес к серверу www.server.ru/enter.php. Тут клиент вводит логин, пароль и потом апплет конектится к серверу. Некоторые из проблем:
* если подключившийся клиент нажмет ctrl+n, откроется копия окна. Выполнив на сервере код " for all clients send 'hello world' ", сообщение поступает в новое окно, причем в 2 эгземплярах. Сообщения сервер принимает из обоих окон.
* или в етом-же окне браузера клиент впишет www.server.ru/enter.php и законектится заного, то сервер шлет сообщения и на новое имя и на старое(видно в дэбагере), которое уже по идее закрыто.

В обоих случаях, проверяется подключен ли клиент - если при посылке сообщение возвращается false, то сокет клиента удаляется из clients. Но как показывает практика, почемуто возвращается true. Еслиже закрыть окно браузера и залогинится через новое окно, то при попытке послать данные в закрытое окно возвращается ошибка - как и должно быть. Почемуже пока окно браузера не закрыто, хоть в него и www.google.ru пиши, сервер всеравно шлет ему сообщения без ошибок. Получается он связывается с браузером а не с аплетом smile Глупость какаято...

ВОПРОС: Можно-ли както сравнить сокеты? Хотелосьбы получить чтото такое

Код

boolean duplicate = false;

clientSocket = serverSocket.accept();

for(int i=0; i<clients.size() - 1; i++)
   if(clientSocket == clients.get(i))
      duplicate = true;

if(!duplicate)
   clients.add(clientSocket);


Или может быть есть какойто другой способ решить эту проблему?

За ранее спасибо.

Автор: COVD 25.2.2006, 18:06
Цитата

Почемуже пока окно браузера не закрыто, хоть в него и www.google.ru пиши, сервер всеравно шлет ему сообщения без ошибок. Получается он связывается с браузером а не с аплетом  Глупость какаято...


Если апплет стартовал, то он продолжает работать, даже если вы в браузер загрузили другую страницу (www.google.ru )
Если из апплета открывается новый фрейм, то окно браузера можно даже закрыть. Апплет будет работать.

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

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)