![]() |
|
Модераторы: LSD, AntonSaburov |
![]()
|
|
| mhalion |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 113 Регистрация: 18.2.2007 Репутация: нет Всего: нет |
Подскажите!
Разрабатываю собственные асинхронные классы для работы с сетью на основе Socket и ServerSocket. Не могу понять каким образом отлавливать факт отключения другой стороны. Например, для клиента у меня есть создаётся дополнительный поток в котором выполняется чтение из InputStream'а. И вот в нем проверяется isClosed (isConnected), но при отключении противоположной стороны она всёравно возвращает true. Так вот: Как с этим разобраться??? Добавлено через 9 минут и 22 секунды Собственно вопрос в следующем: Как без лишних заморочек с эхо ответами (т.е. средствами сокетов java) контролировать состояние соединения??? Притом что read ничего не вызывает, а write не всегда вызывается. Есть ли какие-нибудь нормальные сэмплы для Socket Channels??? |
|||
|
||||
| COVD |
|
||||
|
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1655 Регистрация: 26.7.2005 Репутация: 11 Всего: 43 |
Если противоположная сторона нормально закрывает соединение и линия связи в порядке, то читающий поток, ожидающий данных в методе read(), должен получить EOF исключение, что и является сигналом закрытия противоположной стороны. Если же противоположная сторона закрылась аварийно или линия связи не в порядке, то ваш сокет не получит уведомления о закрытии противоположной стороны. Поэтому узнать о разрыве соединения ( из-за "смерти" клиента или нарушении связи - неизвестно ) можно только попытавшись что-то послать в это соединение. Добавлено через 12 минут и 5 секунд
tcpip сокеты периодически ( раз в два часа, кажется ) пингуют друг друга для подтверждения соединения. Однако если даже сокет закрылся, то обнаружить это все равно можно только при попытке чтения или записи (зарегистрировать в сокете лисенер, чтобы он кинул ему событие "я закрылся" не предусмотрено ). |
||||
|
|||||
| Lisus |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 93 Регистрация: 21.10.2007 Репутация: нет Всего: 2 |
Народ, Стоп.
А разве при закрытии сокетов (что аварийно, что коректрно) противоположная сторона не извещается, что сокет похерен? если Сокет где-то поломался, то оюбая попытка записи или чтения из сокета будет выкидывать исключение. На сколько я понимаю наличие сокетного соединение "контролируется" на низком уровне. |
|||
|
||||
| COVD |
|
|||
|
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1655 Регистрация: 26.7.2005 Репутация: 11 Всего: 43 |
"аварийно" означает много чего. Например, что программа или компьютер зависли, отключили электричество, провайдер отключил интернет, в интернете временный затор. Компьютер физически не в состоянии послать уведомление о закрытии соединения или это уведомление не дошло по причине отсутствия связи. "Контроль" на низком уровне заключается всего лишь в том, что сокеты достаточно редко пингуют друг друга. Если в один из соединенных компьютеров попал вражеский снаряд и он даже пикнуть не успел, а другой компьютер только слушает погибшего и ничего ему не пытается сообщить, то рано или поздно (возможно, через час) внутренний пинг конечно же обнаружит потерю бойца. Изменить дефолтный период внутреннего пинга в сокетах, насколько я знаю, не на всех операционных системах возможно, т.е. это зависит от платформы и не самое удобное решение. Удобнее на мой взгляд - организовать пинг на уровне приложения и определить его периодичность исходя из решаемой задачи. Если же задача предполагает гарантированный регулярный обмен сообщениями между соединенными компьютерами, то возможно никакой пинг не понадобится ибо сами данные будут выполнять его функцию.
|
|||
|
||||
| Proger10 |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 312 Регистрация: 16.12.2008 Репутация: нет Всего: нет |
А где можно подробнее почитать об устройствах сокетов?
Честно говоря, удивлён с информации, что сокеты пингуют друг друга раз в час |
|||
|
||||
| LSD |
|
|||
![]() Leprechaun Software Developer ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 15718 Регистрация: 24.3.2004 Где: Dublin Репутация: 19 Всего: 538 |
В спецификации TCP/IP. -------------------- 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. |
|||
|
||||
![]()
|
| Правила форума "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. |