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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Как создать новое соединение,если клиент не отвеча 
V
    Опции темы
f999t1
Дата 30.4.2013, 15:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Код сервера
Код

public class Server {
    public static void main(String[] args) throws IOException {
 
        ServerSocket serverSocket = null;
       
        try {
            serverSocket = new ServerSocket(4476);
             //serverSocket.setSoTimeout(15000);
        } catch (IOException e) {
            System.err.println("Could not listen on port: 4444.");
            System.exit(1);
        }
        
 
        Socket clientSocket = null;
        try {
            clientSocket = serverSocket.accept();
        } catch (IOException e) {
            System.err.println("Accept failed.");
            System.exit(1);
        }
 
       
        PrintWriter out = new PrintWriter(clientSocket.getOutputStream(), true);  // исходящий. послание клиенту
        BufferedReader in = new BufferedReader(new InputStreamReader(clientSocket.getInputStream())); //входящий поток
        
        String  inputLine;
        String  outputLine;
        
        Protocol pr_serv = new Protocol();        // правило обработки сообщений
 
        outputLine = pr_serv.processInput(null);  // начало работы сервера. от клиента null
          out.println(outputLine);                  // сообщение клиенту
 
        
        //-----------ОБЩЕНИЕ С КЛИЕНТОМ---------------------------
        while ((inputLine = in.readLine()) != null)          // если клиент ответил 
        {
             
         outputLine = pr_serv.processInput(inputLine);   //ответ на запрос клиента
             out.println(outputLine);                        // сообщение клиенту
             
             if (outputLine.equals("Terminate"))
                break;
        }
        //------------общение с клиентом-----------------------
        
        //-----остановка сервера----------
        out.close();
        in.close();
        clientSocket.close();
        serverSocket.close();
        //-----остановка сервера----------
    }
}


Сервер устанавливает соединение с клиентом,
идет некоторая пересылка данных
Сервер находится в циклк while, ожидая сообщения с клиентом.
Как сделать так, чтобы например, если клиент не присылает сообщения
установленное время,например минута, то сервер закрывает данный сокет.
т.е. закрывает связь с клиентом?

соответственно выходит из цикла while
PM MAIL   Вверх
LSD
Дата 30.4.2013, 19:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Leprechaun Software Developer
****


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

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



Цитата(f999t1 @  30.4.2013,  16:02 Найти цитируемый пост)
Как сделать так, чтобы например, если клиент не присылает сообщения
установленное время,например минута, то сервер закрывает данный сокет.
т.е. закрывает связь с клиентом?

Перейти с блокируемого чтения, на неблокируемое.


--------------------
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   Вверх
f999t1
Дата 16.5.2013, 09:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



а можно какой-нибудь пример.
что-то пока не удалось с этим разобраться
PM MAIL   Вверх
LSD
Дата 16.5.2013, 11:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Leprechaun Software Developer
****


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

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



Цитата(f999t1 @  16.5.2013,  10:46 Найти цитируемый пост)
а можно какой-нибудь пример.

NBTimeServer это пример неблокируемго чтения. К нему надо добавить таймер который будет закрывать неактивные соединения.


--------------------
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   Вверх
f999t1
Дата 21.5.2013, 15:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Возникла еще одна проблема, которую не могу решить.
Включаю сервер, затем клиента. 
Связь устанавливается
Потом останавливаю клиента
В этот момент, почему-то останавливается и сервер.
Почему он не ожидает нового подключения? 
PM MAIL   Вверх
LSD
Дата 21.5.2013, 16:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Leprechaun Software Developer
****


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

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



Цитата(f999t1 @  21.5.2013,  16:11 Найти цитируемый пост)
Почему он не ожидает нового подключения?

Ошибка в 14 строке.


--------------------
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   Вверх
f999t1
Дата 21.5.2013, 18:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



В смысле в в 15?
Код

Socket clientSocket = null;
  
PM MAIL   Вверх
LSD
Дата 21.5.2013, 18:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Leprechaun Software Developer
****


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

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



Цитата(f999t1 @  21.5.2013,  19:12 Найти цитируемый пост)
В смысле в в 15?

В смысле что неплохо бы привести код. Ты код сервера не менял с первого поста?


--------------------
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   Вверх
f999t1
Дата 21.5.2013, 18:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Не не менял.
На счет закрытия сокета в цикле, пока решил повременить. 
Пока создал таймер, который сбрасывается при входе в цикл.

В данном коде
Не пойму, что происходит при отсоединение клиента с сокетом.
Сервер всегда закрывается, в смысле СерверСокет или это в коде, какая-то ошибка.

Думал, что если клиент отключается, то сервер так же должен держать открытым сокет,
для следующего подключения клиента 
PM MAIL   Вверх
LSD
Дата 21.5.2013, 19:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Leprechaun Software Developer
****


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

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



Цитата(f999t1 @  21.5.2013,  19:56 Найти цитируемый пост)
Думал, что если клиент отключается, то сервер так же должен держать открытым сокет,

Это не твой код?
Там даже комментарий есть:
Код

        //-----------ОБЩЕНИЕ С КЛИЕНТОМ---------------------------
        <...>
        //------------общение с клиентом-----------------------
        
        //-----остановка сервера----------
        out.close();
        in.close();
        clientSocket.close();
        serverSocket.close();
        //-----остановка сервера----------




--------------------
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   Вверх
f999t1
Дата 22.5.2013, 06:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Код мой. Точнее из книги его взял. Коментарии мои.
Просто с этой темой первый раз столкнулся, еще не совсем  разобрался.

 То есть, если нахожусь в цикле, отключаю клиента,
то сервер выходит из цикла и поэтому дальше по коду сокет закрывается.
Тогда вопрос, почему сервер выходит из цикла, разве он не должен был остаться 
в цикле в ожидании следующего подключения с клиентом?

может, лучше исправить цикл на 

Код

while(true){

if((inputLine = in.readLine()) != null){
//общение с клиентом
}

}

PM MAIL   Вверх
LSD
Дата 22.5.2013, 09:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Leprechaun Software Developer
****


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

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



Этот цикл, только читает данные из клиента. Там все нормально, не трогай его.

Тебе нужно вынести код обслуживающий клиента в отдельный поток. Сделать цикл вокруг serverSocket.accept() и запускать поток обслуживающий клиента.


--------------------
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   Вверх
f999t1
Дата 22.5.2013, 10:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Сделал так
Код

  while(true)
        {
       
          //-----ПЕРВОЕ И ПОВТОРНОЕ ПОДКЛЮЧЕНИЕ КЛИЕНТА-----------------
          try 
          {clientSocket = serverSocket.accept();} 
          catch (IOException e) 
          {System.err.println("ServerSoket Accept failed.");}
         
          out = new PrintWriter(clientSocket.getOutputStream(), true);
          in = new BufferedReader(new InputStreamReader(clientSocket.getInputStream()));
          //------первое и повторное подключение клиента--------------
         
         
         
        //-----------ОБЩЕНИЕ С КЛИЕНТОМ---------------------------
        while ((inputLine = in.readLine()) != null)          // если клиент ответил 
        {
             outputLine = pr_serv.processInput(inputLine);   //ответ на запрос клиента
             out.println(outputLine);                        // сообщение клиенту
        }
        //------------общение с клиентом-----------------------
        
        clientSocket.close();
        
        }
        
    }


Все равно если аварийно закрываю клиента (выхожу крестом)
,то сервер тоже глохнет. То есть в цикле происходит,  ошибка из-за которой 
программа выходит из цикла

Вот ошибка
Код

Exception in thread "main" java.net.SocketException: Connection reset
    at java.net.SocketInputStream.read(Unknown Source)
    at java.net.SocketInputStream.read(Unknown Source)
    at sun.nio.cs.StreamDecoder.readBytes(Unknown Source)
    at sun.nio.cs.StreamDecoder.implRead(Unknown Source)
    at sun.nio.cs.StreamDecoder.read(Unknown Source)
    at java.io.InputStreamReader.read(Unknown Source)
    at java.io.BufferedReader.fill(Unknown Source)
    at java.io.BufferedReader.readLine(Unknown Source)
    at java.io.BufferedReader.readLine(Unknown Source)
    at Server.main(Server.java:82)
 

Это сообщение отредактировал(а) f999t1 - 22.5.2013, 10:21
PM MAIL   Вверх
LSD
Дата 22.5.2013, 10:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Leprechaun Software Developer
****


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

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



Цитата(f999t1 @  22.5.2013,  11:18 Найти цитируемый пост)
Сделал так

Цитата(LSD @  22.5.2013,  10:44 Найти цитируемый пост)
Тебе нужно вынести код обслуживающий клиента в отдельный поток.




--------------------
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   Вверх
f999t1
Дата 22.5.2013, 11:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



У меня будет всего один клиент, который будет сообщаться с 
сервером, просто иногда он будет закрываться,
но при этом сервер должен работать в ожидании нового подключения клиента.
Без создания потока этого не решить?

что-то типа
Код

 while(true)
        {
       
          //-----ПЕРВОЕ И ПОВТОРНОЕ ПОДКЛЮЧЕНИЕ КЛИЕНТА-----------------
          try 
          {clientSocket = serverSocket.accept();} 
          catch (IOException e) 
          {System.err.println("ServerSoket Accept failed.");}
         
          out = new PrintWriter(clientSocket.getOutputStream(), true);
          in = new BufferedReader(new InputStreamReader(clientSocket.getInputStream()));
          //------первое и повторное подключение клиента--------------
         
         
         
        //-----------ОБЩЕНИЕ С КЛИЕНТОМ---------------------------
      Thread t = new Thread(); // суда вставить цикл while (чтение сообщений от клиента)
      t.start() ; 
      //------------общение с клиентом-----------------------
        
        clientSocket.close();
        
        }
        
    }



И не будут ли создаваться бесконечное кол-во потоков?

Это сообщение отредактировал(а) f999t1 - 22.5.2013, 11:07
PM MAIL   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Java"
LSD   AntonSaburov
powerOn   tux
  • Прежде, чем задать вопрос, прочтите это!
  • Книги по Java собираются здесь.
  • Документация и ресурсы по Java находятся здесь.
  • Используйте теги [code=java][/code] для подсветки кода. Используйтe чекбокс "транслит", если у Вас нет русских шрифтов.
  • Помечайте свой вопрос как решённый, если на него получен ответ. Ссылка "Пометить как решённый" находится над первым постом.
  • Действия модераторов можно обсудить здесь.
  • FAQ раздела лежит здесь.

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

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


 




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


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

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