Модераторы: LSD, AntonSaburov
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Клиент-серверные приложения на сокетах, Как узанть, что связь с клиентом потерян 
:(
    Опции темы
agx
Дата 20.2.2007, 15:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 44
Регистрация: 11.3.2005

Репутация: нет
Всего: нет



Добрый день!
Плиз, подскажите, как быть: есть клиент-серверное приложение. К серверу одновременно может быть подключено множество клиентов, каждый из которым может периодически обмениваться данными в обе стороны. Как сервер может узнать, что соединение с клиентом потеряно? Тоесть, клиент не закрывал сокет со своей стороны, а просто, скажем, оборвался сетевой шнур. Данные от клиента, разумеется, не приходят, сервер пишет в сокет данные, которые до клиента тоже, само собой не доходят. И не возникает никаких exception-ов! Получается, что посланные данные теряются. Как сервер может определить, есть ли связь с клиентом? Единственое, что я смог придумать, это делать постоянный пинг и ставить таймаут на операцию считывания ответа от клиента. Но ИМХО это изврат, должно ведь в механизме TCP/IP сокетов это как-то автоматизировано?
PM MAIL   Вверх
LSD
Дата 20.2.2007, 15:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Leprechaun Software Developer
****


Профиль
Группа: Модератор
Сообщений: 15718
Регистрация: 24.3.2004
Где: Dublin

Репутация: 19
Всего: 538



Цитата(agx @  20.2.2007,  15:06 Найти цитируемый пост)
сервер пишет в сокет данные, которые до клиента тоже, само собой не доходят. И не возникает никаких exception-ов!

Почему не возникает? Очень даже возникает, при отправке данных ту получишь ошибку.


--------------------
Disclaimer: this post contains explicit depictions of personal opinion. So, if it sounds sarcastic, don't take it seriously. If it sounds dangerous, do not try this at home or at all. And if it offends you, just don't read it.
PM MAIL WWW   Вверх
agx
Дата 20.2.2007, 15:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 44
Регистрация: 11.3.2005

Репутация: нет
Всего: нет



Тоесть метод write() должен генерить IOException? Я тоже так думал, но экшепшена не возникает! Клиент отвалился, но сервер продолжает слать ему данные, как ни в чем не бывало! Может у меня уже глюки? %)
PM MAIL   Вверх
LSD
Дата 20.2.2007, 15:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Leprechaun Software Developer
****


Профиль
Группа: Модератор
Сообщений: 15718
Регистрация: 24.3.2004
Где: Dublin

Репутация: 19
Всего: 538



Попробуй после вызова write() вызвать flush().


--------------------
Disclaimer: this post contains explicit depictions of personal opinion. So, if it sounds sarcastic, don't take it seriously. If it sounds dangerous, do not try this at home or at all. And if it offends you, just don't read it.
PM MAIL WWW   Вверх
COVD
Дата 20.2.2007, 16:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1655
Регистрация: 26.7.2005

Репутация: 11
Всего: 43



Цитата

Единственое, что я смог придумать, это делать постоянный пинг и ставить таймаут на операцию считывания ответа от клиента. Но ИМХО это изврат, должно ведь в механизме TCP/IP сокетов это как-то автоматизировано? 


Это не "изврат", а нормальная практика. Исключение рано или поздно выскочит. Но период неопределенности может быть недопустимо большим для приложения. А пинг и таймаут вы контролируете сами.

PM MAIL   Вверх
agx
Дата 26.2.2007, 13:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 44
Регистрация: 11.3.2005

Репутация: нет
Всего: нет



flush() вызывать пробовал, та же проблема.
Примерно секунд через сорок после обрыва связи исключение стабильно вылетает на методе read().
Был найден такой выход:
Писать сообщения в сокет и параллельно сохранять их в очереди. Обязать клиента на каждое собщение отсылать уведомление о получении. При приеме каждого уведомления удалять сообщение из начала очереди. При превышении очередью определенной длины запускать таймер, в течении которого, если клиент не пришлет недостающие отчеты (неотвеченных сообщений не станет меньше заданого числа), он будет отключен. Ну и точно также, при SocketException отключать клиента. А при повторном подключении досылать им все сообщения из очереди.
Как считаете, нормальный алгоритм, или можно придумать что-нибудь получше?
PM MAIL   Вверх
LSD
Дата 26.2.2007, 15:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Leprechaun Software Developer
****


Профиль
Группа: Модератор
Сообщений: 15718
Регистрация: 24.3.2004
Где: Dublin

Репутация: 19
Всего: 538



Цитата(agx @  26.2.2007,  13:01 Найти цитируемый пост)
Как считаете, нормальный алгоритм, или можно придумать что-нибудь получше?

По мне нормальный.


--------------------
Disclaimer: this post contains explicit depictions of personal opinion. So, if it sounds sarcastic, don't take it seriously. If it sounds dangerous, do not try this at home or at all. And if it offends you, just don't read it.
PM MAIL WWW   Вверх
COVD
Дата 26.2.2007, 19:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1655
Регистрация: 26.7.2005

Репутация: 11
Всего: 43



нормальный
PM MAIL   Вверх
Aizek
Дата 10.5.2008, 17:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 36
Регистрация: 29.11.2006

Репутация: нет
Всего: нет



Придуманный велосипед ИМХО smile) Обратный ответ называется квитанция, правда когда мы ее мучали проверяли правильный ли приходит пакет или нет, если нет, повторная передача. А если ответа нет, тогда таймаутsmile А теперь хотелось бы спросить у знающих людей по той же теме, у меня есть клиент и сервер, просто содранный с примеров на виндграде http://forum.vingrad.ru/faq/topic-158005/h...+rmi/index.html . У меня возникает такой вопрос, насколько я понял данный клиент-сервер могут общаться только раз на раз и другой клиент к серверу подключиться не может. Что надо сделать, чтобы сервер мог общаться с несколькими клиентами? Придется делать потоки? На форуме нашел, что надо реализовать NIO  Вот в общем и все, что хочу узнать. Не хочу просто создавать еще одну тему.
PM MAIL   Вверх
Aizek
Дата 10.5.2008, 18:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 36
Регистрация: 29.11.2006

Репутация: нет
Всего: нет



Нашел еще одну доку , она может решить мою проблему?
ЗЫ пока сижу вчитываюсь...
PM MAIL   Вверх
vodking
Дата 13.5.2008, 12:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 4
Регистрация: 13.5.2008
Где: Новосибирск

Репутация: нет
Всего: нет



Правильный, радикальный, и, как показывает практика, единственный выход - юзать java.nio.channels. Исключение появляется мгновенно, даже на юниксах, где java.io вообще просто молчит при разрывах связи.
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Java"
LSD   AntonSaburov
powerOn   tux
  • Прежде, чем задать вопрос, прочтите это!
  • Книги по Java собираются здесь.
  • Документация и ресурсы по Java находятся здесь.
  • Используйте теги [code=java][/code] для подсветки кода. Используйтe чекбокс "транслит", если у Вас нет русских шрифтов.
  • Помечайте свой вопрос как решённый, если на него получен ответ. Ссылка "Пометить как решённый" находится над первым постом.
  • Действия модераторов можно обсудить здесь.
  • FAQ раздела лежит здесь.

Если Вам помогли, и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, LSD, AntonSaburov, powerOn, tux.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Java: Работа с сетью | Следующая тема »


 




[ Время генерации скрипта: 0.0730 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.