![]() |
Модераторы: LSD, AntonSaburov |
![]() ![]() ![]() |
|
agx |
|
|||
Новичок Профиль Группа: Участник Сообщений: 44 Регистрация: 11.3.2005 Репутация: нет Всего: нет |
Добрый день!
Плиз, подскажите, как быть: есть клиент-серверное приложение. К серверу одновременно может быть подключено множество клиентов, каждый из которым может периодически обмениваться данными в обе стороны. Как сервер может узнать, что соединение с клиентом потеряно? Тоесть, клиент не закрывал сокет со своей стороны, а просто, скажем, оборвался сетевой шнур. Данные от клиента, разумеется, не приходят, сервер пишет в сокет данные, которые до клиента тоже, само собой не доходят. И не возникает никаких exception-ов! Получается, что посланные данные теряются. Как сервер может определить, есть ли связь с клиентом? Единственое, что я смог придумать, это делать постоянный пинг и ставить таймаут на операцию считывания ответа от клиента. Но ИМХО это изврат, должно ведь в механизме TCP/IP сокетов это как-то автоматизировано? |
|||
|
||||
LSD |
|
|||
![]() Leprechaun Software Developer ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 15718 Регистрация: 24.3.2004 Где: Dublin Репутация: 19 Всего: 538 |
Почему не возникает? Очень даже возникает, при отправке данных ту получишь ошибку. -------------------- 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. |
|||
|
||||
agx |
|
|||
Новичок Профиль Группа: Участник Сообщений: 44 Регистрация: 11.3.2005 Репутация: нет Всего: нет |
Тоесть метод write() должен генерить IOException? Я тоже так думал, но экшепшена не возникает! Клиент отвалился, но сервер продолжает слать ему данные, как ни в чем не бывало! Может у меня уже глюки? %)
|
|||
|
||||
LSD |
|
|||
![]() 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. |
|||
|
||||
COVD |
|
|||
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1655 Регистрация: 26.7.2005 Репутация: 11 Всего: 43 |
Это не "изврат", а нормальная практика. Исключение рано или поздно выскочит. Но период неопределенности может быть недопустимо большим для приложения. А пинг и таймаут вы контролируете сами. |
|||
|
||||
agx |
|
|||
Новичок Профиль Группа: Участник Сообщений: 44 Регистрация: 11.3.2005 Репутация: нет Всего: нет |
flush() вызывать пробовал, та же проблема.
Примерно секунд через сорок после обрыва связи исключение стабильно вылетает на методе read(). Был найден такой выход: Писать сообщения в сокет и параллельно сохранять их в очереди. Обязать клиента на каждое собщение отсылать уведомление о получении. При приеме каждого уведомления удалять сообщение из начала очереди. При превышении очередью определенной длины запускать таймер, в течении которого, если клиент не пришлет недостающие отчеты (неотвеченных сообщений не станет меньше заданого числа), он будет отключен. Ну и точно также, при SocketException отключать клиента. А при повторном подключении досылать им все сообщения из очереди. Как считаете, нормальный алгоритм, или можно придумать что-нибудь получше? |
|||
|
||||
LSD |
|
|||
![]() Leprechaun Software Developer ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 15718 Регистрация: 24.3.2004 Где: Dublin Репутация: 19 Всего: 538 |
По мне нормальный. -------------------- 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. |
|||
|
||||
COVD |
|
|||
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1655 Регистрация: 26.7.2005 Репутация: 11 Всего: 43 |
нормальный
|
|||
|
||||
Aizek |
|
|||
Новичок Профиль Группа: Участник Сообщений: 36 Регистрация: 29.11.2006 Репутация: нет Всего: нет |
Придуманный велосипед ИМХО
![]() ![]() |
|||
|
||||
Aizek |
|
|||
Новичок Профиль Группа: Участник Сообщений: 36 Регистрация: 29.11.2006 Репутация: нет Всего: нет |
||||
|
||||
vodking |
|
|||
Новичок Профиль Группа: Участник Сообщений: 4 Регистрация: 13.5.2008 Где: Новосибирск Репутация: нет Всего: нет |
Правильный, радикальный, и, как показывает практика, единственный выход - юзать java.nio.channels. Исключение появляется мгновенно, даже на юниксах, где java.io вообще просто молчит при разрывах связи.
|
|||
|
||||
![]() ![]() ![]() |
Правила форума "Java" | |
|
Если Вам помогли, и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, LSD, AntonSaburov, powerOn, tux. |
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | Java: Работа с сетью | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |