Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Java: Работа с сетью > Закрытие клиентского сокета на сервере


Автор: Java2 10.8.2006, 18:36
Народ, у меня на сервере есть клиентский сокет, который породил метод serverSocket.accept();
У меня есть сервер, который успешно работает. Вот его базовый код:

Код


                String command;
                while(!clientSocket.isClosed()) {
                    out.println("Socket is opened");
                    if(reader.ready()) {
                        out.println("reading information");
                        command = reader.readLine();
                        out.println("command: " + command);
                        if(command.equalsIgnoreCase(EXIT_COMMAND)) {
                            out.println("exiting");
                            return;
                        }
                        writer.println( processCommand(command) );
                    }
                }

получается такая штука: если пользователь передаст серверу строку "exit", тогда соединение с клиентом успешно будет закрыто и сервер будет продолжать ожидать запросы от клиента, но если я просто прибиваю клиента, т.е. завершаю работу программы, к примеру, нажав ctrl + C в консоле, тогда сервер всё равно продолжит крутить цикл для клиентского сокета, не смотря на то, что клиента уже нет.
Почему?

Автор: LSD 10.8.2006, 21:29
Потому что сервер не знает что клиент, отсоединился. Единственный способ, это узнать это попытаться послать ему данные, тогда произойдет IOException.

Автор: Java2 11.8.2006, 10:43
Цитата(LSD @  10.8.2006,  21:29 Найти цитируемый пост)
Потому что сервер не знает что клиент, отсоединился. Единственный способ, это узнать это попытаться послать ему данные, тогда произойдет IOException. 


Ну, а если обрыв произошел в тот момент, когда сервер ожидает запрос от клиента, тогда он будет его ожидать вечно, если специально не пинговать клиента? Как лучше это спроектировать?

Автор: batigoal 11.8.2006, 12:55
Цитата(Java2 @  11.8.2006,  11:43 Найти цитируемый пост)
Ну, а если обрыв произошел в тот момент, когда сервер ожидает запрос от клиента, тогда он будет его ожидать вечно, если специально не пинговать клиента?

В моем понимании, это штатный режим работы сервера...

Автор: COVD2 11.8.2006, 15:22
Цитата

Ну, а если обрыв произошел в тот момент, когда сервер ожидает запрос от клиента, тогда он будет его ожидать вечно, если специально не пинговать клиента? Как лучше это спроектировать?


Мониторить соединения клиентов отдельным потоком на сервере.

Автор: Java2 11.8.2006, 15:39
Цитата(COVD2 @  11.8.2006,  15:22 Найти цитируемый пост)
Мониторить соединения клиентов отдельным потоком на сервере. 


Пингуя каждый сокет?

Автор: COVD2 11.8.2006, 16:48
Цитата

Пингуя каждый сокет?


Можно регулярно посылать heartbeat - "пульс". Если соединение предполагает регулярный обмен данными, то можно просто паузы отслеживать и убивать соединение, в которых она достигла предела. 
В любом случае это дело творческое, поскольку причин много. Если данные перестают поступать, то вы не всегда сразу можете определить, что это - у клиента электричество отключили или временная задержка в интернете.

Автор: Java2 11.8.2006, 17:07
Цитата(COVD2 @  11.8.2006,  16:48 Найти цитируемый пост)
Если соединение предполагает регулярный обмен данными, то можно просто паузы отслеживать и убивать соединение, в которых она достигла предела. 

а как эти паузы сваять?

Автор: COVD2 11.8.2006, 17:34
пауза - это разность между текущим временем и временем последнего запроса клиента, например. Поток - монитор может для каждого открытого соединения периодически ее вычислять. Клиенту можно поручить отправлять через равные промежутки времени запрос - "пульс", который для сервера только означает, что клиент и канал связи живы.  

Автор: Danissimo 14.8.2006, 16:07
На скока  знаю, TCP протокол посылает heartbeats, кажется, каждые два часа. => как максимум через 2 часа принимающая сторона поймет, что соединение разорвано.

Автор: COVD2 14.8.2006, 16:29
Цитата

На скока  знаю, TCP протокол посылает heartbeats, кажется, каждые два часа. => как максимум через 2 часа принимающая сторона поймет, что соединение разорвано.
 - ну вот, значит, enjoy и не надо велосипед изобретать  smile 

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)