![]() |
|
Модераторы: LSD, AntonSaburov |
![]()
|
|
| Logo |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 694 Регистрация: 22.7.2008 Репутация: нет Всего: 10 |
Как в Socket задать параметры для SO_KEEPALIVE? Нахожу в документации только методы getKeepAlive и setKeepAlive, но они задают лишь булево значение.
|
|||
|
||||
| Logo |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 694 Регистрация: 22.7.2008 Репутация: нет Всего: 10 |
Как определить разрыв соединения?
|
|||
|
||||
| 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. |
|||
|
||||
| Logo |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 694 Регистрация: 22.7.2008 Репутация: нет Всего: 10 |
В TCP соединении уже предусмотрена для этого TCP-keepalive. Вот только возможности задать свои значения tcp_keepalive_time, tcp_keepalive_intvl, tcp_keepalive_probes из Java никак не нахожу. Это сообщение отредактировал(а) Logo - 11.12.2012, 17:27 |
|||
|
||||
| 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. |
|||
|
||||
| Logo |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 694 Регистрация: 22.7.2008 Репутация: нет Всего: 10 |
По умолчанию не включена, но ее можно включить, в Java для этого есть setKeepAlive, но опции как задать, не понятно.
Т.е. не все ОС/TCP-клиенты обязаны соблюдать TCP keep-alive? А как дела на практике? |
|||
|
||||
| COVD |
|
|||
|
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1655 Регистрация: 26.7.2005 Репутация: 11 Всего: 43 |
Встроенная проверка соединения, если включена, осуществляется примерно раз в два часа посылкой heartbeat. Этот период не регулируется и зависит от реализации. Стандарт был заложен давно. На практике такой большой период неопределенности часто не устраивает, поэтому распространенным, простым и переносимым решением является организация проверки соединения в приложении (т.е. не используют keep-alive). Программируют отсылку heartbeat с нужным периодом и его обработку.
|
|||
|
||||
| LSD |
|
|||
![]() Leprechaun Software Developer ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 15718 Регистрация: 24.3.2004 Где: Dublin Репутация: 19 Всего: 538 |
Не все реализации TCP стека должны поддерживать такую опцию. На практике Windows и Linux поддерживают. -------------------- 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. |
|||
|
||||
| Logo |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 694 Регистрация: 22.7.2008 Репутация: нет Всего: 10 |
COVD
Вообще-то в C/C++ можно задавать свои значения структуры keep-alive, как в других языках не знаю. А в Java видимо нет(. Только задать значения через sysctrl, что выглядит как хак, т.к. влияет на всю систему. Либо расширять прикладной протокол, что уже несколько сложнее. + Придется, как я понимаю, добавить еще один поток, или переделать на неблокирующие сокеты, т.к. чтение блокирует поток. |
|||
|
||||
| COVD |
|
|||
|
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1655 Регистрация: 26.7.2005 Репутация: 11 Всего: 43 |
Можно, но это не 100% переносимое решение. На каких-то ОС это было невозможно, наверное. Видимо, поэтому в Java этого нет. С другой стороны, не так много ситуаций, когда это необходимо. В соединениях запрос-ответ достаточно таймаутов на соединение и чтение. В соединениях, где передается непрерывный поток данных, сам факт поступления данных является индикатором исправности соединения, и достаточно таймаута на чтение. И только в случае, когда поток передаваемых данных имеет естественные паузы требуется в эти паузы добавлять heartbeat, чтобы не сработал таймаут на чтение на приемной стороне. Да, для реализации heartbeat может потребоваться дополнительный поток на передающей стороне. Но такое усложнение прикладного протокола не представляется чрезмерным. Это сообщение отредактировал(а) COVD - 16.12.2012, 18:53 |
|||
|
||||
| LSD |
|
|||
![]() Leprechaun Software Developer ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 15718 Регистрация: 24.3.2004 Где: Dublin Репутация: 19 Всего: 538 |
Кстати есть еще один момент: heartbeat message еще показывает, что сервер/клиент жив. TCP keepalives поддерживается на уровне ОС, и возможна ситуация когда сервер/клиент завис, а keepalive пакеты по прежнему идут.
-------------------- 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. |
|||
|
||||
| Logo |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 694 Регистрация: 22.7.2008 Репутация: нет Всего: 10 |
А сам keep-alive тем не менее есть, странно... |
|||
|
||||
| COVD |
|
|||
|
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1655 Регистрация: 26.7.2005 Репутация: 11 Всего: 43 |
Это давняя история и вы можете найти много обсуждений в интернете. Вы не первый, кому представляется странным, что в Java нельзя изменить период встроенного keep-alive.
Вот интересно, если на сервере несколько приложений, которым нужен каждому свой период проверки соединения. И приложения имели бы возможность установить свой период keep-alive в сокете. Не было бы здесь конфликта? |
|||
|
||||
![]()
|
| Правила форума "Java" | |
|
|
Если Вам помогли, и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, LSD, AntonSaburov, powerOn, tux. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | Java: Работа с сетью | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |