Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Java программирование > Общие вопросы по Java, Java SE, Kotlin
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 09.03.2010, 17:47   #1
Lemon2009
Пользователь
 
Аватар для Lemon2009
 
Регистрация: 29.07.2009
Сообщений: 72
По умолчанию

Здравствуйте.

Создаю сервер на сокетах.
Но возникает проблема при отключении клиента от сервера.

Когда клиент отключается функции наподобии isConnected, isClosed возвращают результат , что связь между клиент-сервером до сих пор есть.
В итоге поток выполняется на сервере, а связи нету.

Код:
while(!client.isClosed()) {
  ....
}
Только не предлагайте такой вариант: клиенту при отключение отправлять команду, что он отключается.

===================

уточню некоторые моменты.

isConnected, isClosed не возвращают должного результата на стороне сервера.

Сервер прослушивает порт и создает каждому клиенту отдельный поток.


Предупреждение модератора: оверпостинг запрещен!
Совершенство в простоте

Последний раз редактировалось alexinspir; 10.03.2010 в 01:04.
Lemon2009 вне форума Ответить с цитированием
Старый 09.03.2010, 23:14   #2
alexinspir
Новичок
Джуниор
 
Аватар для alexinspir
 
Регистрация: 26.08.2008
Сообщений: 1,010
По умолчанию

Цитата:
Сообщение от Lemon2009 Посмотреть сообщение
Здравствуйте.

Создаю сервер на сокетах.
Но возникает проблема при отключении клиента от сервера.

Когда клиент отключается функции наподобии isConnected, isClosed возвращают результат , что связь между клиент-сервером до сих пор есть.
В итоге поток выполняется на сервере, а связи нету.

Код:
while(!client.isClosed()) {
  ....
}
Только не предлагайте такой вариант: клиенту при отключение отправлять команду, что он отключается.
Клиент при штатном отключении ВСЕГДА ОБЯЗАН посылать команду, ибо противный случай всегда должен рассматриваться как аварийное отключение и у текущей транзакции должен быть произведен откат.

p/s/
Код:
while(!client.isClosed()) {
  ....
}
без блокировки в каждом цикле, не есть хороший способ.

Цитата:
Сообщение от Lemon2009 Посмотреть сообщение
уточню некоторые моменты.

isConnected, isClosed не возвращают должного результата на стороне сервера.

Сервер прослушивает порт и создает каждому клиенту отдельный поток.

Попробуйте это: http://java.sun.com/javase/6/docs/ap...meout%28int%29
только внимательно прочтите описание.
ромик0: Cколько получают здешние модераторы?
pu4koff: У модераторов сдельная оплата труда. Выдал предупреждение - плюс к премии. Выдал бан - лучший модератор месяца со всеми вытекающими.
alexinspir вне форума Ответить с цитированием
Старый 09.03.2010, 23:53   #3
Lemon2009
Пользователь
 
Аватар для Lemon2009
 
Регистрация: 29.07.2009
Сообщений: 72
По умолчанию

Цитата:
без блокировки в каждом цикле, не есть хороший способ.
как это понять?

======================

вместо setSoTimeout сделал свой таймаут. просто по истечению 60 секунд неактивности отрубает коннект.

эта вещь конечно слабость перед досами.


Предупреждение модератора: оверпостинг запрещен!
Совершенство в простоте

Последний раз редактировалось alexinspir; 10.03.2010 в 01:05.
Lemon2009 вне форума Ответить с цитированием
Старый 10.03.2010, 01:15   #4
alexinspir
Новичок
Джуниор
 
Аватар для alexinspir
 
Регистрация: 26.08.2008
Сообщений: 1,010
По умолчанию

Цитата:
Сообщение от Lemon2009 Посмотреть сообщение
как это понять?
внутри цикла должна быть блокировка, в целях избежания пожирания процессорного времени. по вашему циклу не ясно - я просто привел к сведению эту информацию.
Цитата:
Сообщение от Lemon2009 Посмотреть сообщение
эта вещь конечно слабость перед досами.
Не вижу слабостей. "не валидные" соединения можно сбрасывать, при множественных валидных запросах можно временно банить по ИП, непосредственно в Java, при частых "не валидных" запросах нет защиты внутри Java, тут уже надо настраивать фаер на машине на которой работает сервер.
ромик0: Cколько получают здешние модераторы?
pu4koff: У модераторов сдельная оплата труда. Выдал предупреждение - плюс к премии. Выдал бан - лучший модератор месяца со всеми вытекающими.
alexinspir вне форума Ответить с цитированием
Старый 10.03.2010, 08:30   #5
Lemon2009
Пользователь
 
Аватар для Lemon2009
 
Регистрация: 29.07.2009
Сообщений: 72
По умолчанию

Цитата:
Сообщение от alexinspir Посмотреть сообщение
внутри цикла должна быть блокировка, в целях избежания пожирания процессорного времени. по вашему циклу не ясно - я просто привел к сведению эту информацию.
Если ты про Thread.sleep(); то он присутствует Ж)
Совершенство в простоте
Lemon2009 вне форума Ответить с цитированием
Старый 10.03.2010, 09:57   #6
alexinspir
Новичок
Джуниор
 
Аватар для alexinspir
 
Регистрация: 26.08.2008
Сообщений: 1,010
По умолчанию

Цитата:
Сообщение от Lemon2009 Посмотреть сообщение
Если ты про Thread.sleep(); то он присутствует Ж)
>_<

Я имел ввиду блокировку ожидания("ждать пока не наступит определенное условие").
например метод BufferedReader.readLine() ждет пока в потоке не появится \n


Thread.sleep() тоже выход, но не очень хороший - при большом количестве информации сервак может просто "захлебнуться" внезапно накопившимся потоком данных.
ромик0: Cколько получают здешние модераторы?
pu4koff: У модераторов сдельная оплата труда. Выдал предупреждение - плюс к премии. Выдал бан - лучший модератор месяца со всеми вытекающими.
alexinspir вне форума Ответить с цитированием
Старый 11.03.2010, 18:01   #7
Lemon2009
Пользователь
 
Аватар для Lemon2009
 
Регистрация: 29.07.2009
Сообщений: 72
По умолчанию

не охота создавать лишние темы. поэтому задам здесь. почти по теме.

Код:
public void run() {
        try {            
            System.out.println("Listen port " + workspace.getPort());
            listener = new ServerSocket(workspace.getPort());
            Socket connect;

            while(!listener.isClosed()) {
                connect = listener.accept();
                workspace.clients.addElement(new Client(workspace, connect));
            }
        } catch (IOException ex) {
            ex.printStackTrace();
        }
    }
как можно убить этот поток?
а то на accept блокируется.
Совершенство в простоте
Lemon2009 вне форума Ответить с цитированием
Старый 11.03.2010, 18:37   #8
alexinspir
Новичок
Джуниор
 
Аватар для alexinspir
 
Регистрация: 26.08.2008
Сообщений: 1,010
По умолчанию

Цитата:
Сообщение от Lemon2009 Посмотреть сообщение
как можно убить этот поток?
а то на accept блокируется.
нити обрываются через Thread.interrupt();
ромик0: Cколько получают здешние модераторы?
pu4koff: У модераторов сдельная оплата труда. Выдал предупреждение - плюс к премии. Выдал бан - лучший модератор месяца со всеми вытекающими.
alexinspir вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
сокеты в С TDrive C/C++ Сетевое программирование 6 03.03.2010 11:59
Сокеты SL1CK Общие вопросы C/C++ 8 05.10.2009 13:20
Сокеты Pavelok Работа с сетью в Delphi 3 16.09.2009 16:57
Сокеты IICuX123 Общие вопросы .NET 6 27.07.2009 01:27
IP клиента JoanM Работа с сетью в Delphi 13 01.05.2008 16:30