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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Sockets 
:(
    Опции темы
mhalion
Дата 22.5.2008, 12:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Подскажите!
Разрабатываю собственные асинхронные классы для работы с сетью на основе Socket и ServerSocket.
Не могу понять каким образом отлавливать факт отключения другой стороны. Например, для клиента у меня есть создаётся дополнительный поток в котором выполняется чтение из InputStream'а. И вот в нем проверяется isClosed (isConnected), но при отключении противоположной стороны она всёравно возвращает true.
Так вот: Как с этим разобраться???

Добавлено через 9 минут и 22 секунды
Собственно вопрос в следующем: Как без лишних заморочек с эхо ответами (т.е. средствами сокетов java) контролировать состояние соединения??? Притом что read ничего не вызывает, а write не всегда вызывается. Есть ли какие-нибудь нормальные сэмплы для Socket Channels???
PM MAIL   Вверх
COVD
Дата 22.5.2008, 15:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



Цитата

Например, для клиента у меня есть создаётся дополнительный поток в котором выполняется чтение из InputStream'а. И вот в нем проверяется isClosed (isConnected), но при отключении противоположной стороны она всёравно возвращает true.


Если противоположная сторона нормально закрывает соединение и линия связи в порядке, то читающий поток, ожидающий данных в методе read(), должен получить EOF исключение, что и является сигналом закрытия противоположной стороны. 
 
Если же противоположная сторона закрылась аварийно или линия связи не в порядке, то ваш сокет не получит уведомления о закрытии противоположной стороны. Поэтому узнать о разрыве соединения ( из-за "смерти" клиента или нарушении связи - неизвестно ) можно только попытавшись что-то послать в это соединение.

Добавлено через 12 минут и 5 секунд
Цитата

Как без лишних заморочек с эхо ответами (т.е. средствами сокетов java) контролировать состояние соединения


tcpip сокеты периодически ( раз в два часа, кажется ) пингуют друг друга для подтверждения соединения. Однако если даже сокет закрылся, то обнаружить это все равно можно только при попытке чтения или записи  (зарегистрировать в сокете лисенер, чтобы он кинул ему событие "я закрылся" не предусмотрено ). 
PM MAIL   Вверх
Lisus
Дата 3.6.2008, 09:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Народ, Стоп. 

А разве при закрытии сокетов (что аварийно, что коректрно) противоположная сторона не извещается, что сокет похерен? если Сокет где-то поломался, то оюбая попытка записи или чтения из сокета будет выкидывать исключение. На сколько я понимаю наличие сокетного соединение "контролируется" на низком уровне. 
PM MAIL   Вверх
COVD
Дата 3.6.2008, 16:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



"аварийно" означает много чего. Например, что программа или компьютер зависли, отключили электричество, провайдер отключил интернет, в интернете временный затор. Компьютер физически не в состоянии  послать уведомление о закрытии соединения или это уведомление не дошло по причине отсутствия связи. "Контроль" на низком уровне заключается всего лишь в том, что сокеты достаточно редко пингуют друг друга. Если в один из соединенных компьютеров попал вражеский снаряд и он даже пикнуть не успел, а другой компьютер только слушает погибшего и ничего ему не пытается сообщить, то рано или поздно (возможно, через час) внутренний пинг конечно же обнаружит потерю бойца. Изменить дефолтный период внутреннего пинга в сокетах, насколько я знаю, не на всех операционных системах возможно, т.е. это зависит от платформы и не самое удобное решение. Удобнее на мой взгляд - организовать пинг на уровне приложения и определить его периодичность исходя из решаемой задачи.  Если же задача предполагает гарантированный регулярный обмен сообщениями между соединенными компьютерами, то возможно никакой пинг не понадобится ибо сами данные будут выполнять его функцию.
PM MAIL   Вверх
Proger10
Дата 4.2.2009, 01:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



А где можно подробнее почитать об устройствах сокетов?
Честно говоря, удивлён с информации, что сокеты пингуют друг друга раз в час smile
PM MAIL   Вверх
LSD
Дата 4.2.2009, 13:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Leprechaun Software Developer
****


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

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



Цитата(Proger10 @  4.2.2009,  01:20 Найти цитируемый пост)
А где можно подробнее почитать об устройствах сокетов?

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

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

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


 




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


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

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