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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Непонятный сброс соединение, Обычный TCP сервер 
:(
    Опции темы
Su_
Дата 17.1.2010, 22:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



У меня есть метод ,который открывет сокет на указанном порту 

Код

public void OpenTCPSocet() throws IOException
{


    byte bKbdInput[] = new byte[256];

    // Объект класса ServerSocket для создания канала
    ServerSocket ss = null;

    // Сокет сервера
    Socket s = null;

    // Входной поток для приема команд от клиента
    InputStream is = null;

    // Выходной поток для передачи ответа клиенту
    OutputStream os = null;

    try
    {
      System.out.println("Socket Server Application");

    }
    catch(Exception ioe)
    {
      // При возникновении исключения выводим его описание
      // на консоль
      System.out.println(ioe.toString());
    }

    try
    {
      // Создаем объект класса ServerSocket
                System.out.println("Try to start Tcp server!!!");

      ss = new ServerSocket(Port);

      // Ожидаем соединение
  while(true)
      {
s = ss.accept();

      // команд от клиента
      is = s.getInputStream();

      // Открываем выходной поток для передачи
      // ответа клиенту
      os = s.getOutputStream();

      // Буфер для чтения команд
      byte buf[] = new byte[512];

      // Размер принятого блока данных
      int lenght;

      // Цикл обработки команд, полученных от клиента

        // Получаем команду
        lenght = is.read(buf);          //<----------------------------------------------------------------

        // Если входной поток исчерпан, завершаем
        // цикл обработки команд
        if(lenght == -1)
        {
          prints("Это был Тест соединение");
          is.close();
          os.close();
          // Закрываем сокет сервера
          s.close();

        }
else
{
     prints("Это сообщение длинной "+lenght);

     String str = new String(buf,"Cp1251");
        // Обрезаем строку, удаляя символ конца строки
        StringTokenizer st;
        st   = new StringTokenizer(str, "\r\n");
        str = new String((String)st.nextElement());
        // Выводим строку команды на консоль
        System.out.println(">  " + str);
        str_arrays=pars_Array(str);


// Сбрасываем буфер выходного потока
os.flush();

}
}
      // Закрываем входной и выходной потоки
  
    }
    catch(Exception ioe)
    {
      is.close();
      os.close();
      s.close();
      ss.close();

      System.out.println(ioe.toString());
     prints(": "+"*-*-*-*Проблемы с соединением,попытка восстановления*-*-*-*");
     // Закрываем соединение
     }



 }


У меня так же есть нить которая его запускает

Код

 m_thr_tcp = new Thread() {
            @Override
       public void run()
       { 
                 while(true) {
                  prints(": "+"ТСП поток запущен ");
                    try {
                        OpenTCPSocet();
                      
                    } catch (IOException ex) {
                        Logger.getLogger(Fire.class.getName()).log(Level.SEVERE, null, ex);
                    }
                  try {
            prints(": "+"*-*-*-*Ждем секунду,и перезапускаем*-*-*-*");
             Thread.sleep(1000);
           }
           catch(Exception e)
           {
             
           }

           }}

     };


его запуск
Код

  m_thr.start();


Не могу понять, иногда(причину пока не смог уточнить) в строчке 
Код

        lenght = is.read(buf);    

происходит вылет, на исключение ,далее на while(true) и он опять пересоздает сокет на указанном порту.. Чем это может быть вызыванно? и верно ли я вообще создал сервер в отдельно нити? Заранее спасибо


--------------------
user posted image

PM MAIL WWW   Вверх
Kangaroo
Дата 18.1.2010, 01:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


AA - Aussie Animal
****


Профиль
Группа: Участник Клуба
Сообщений: 2042
Регистрация: 7.10.2006
Где: US

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



Цитата(Su_ @  17.1.2010,  22:56 Найти цитируемый пост)
происходит вылет, на исключение ,далее на while(true) и он опять пересоздает сокет на указанном порту.. Чем это может быть вызыванно? 

Ты бы намекнул, что за исключение.

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


--------------------
Lost....
PM MAIL MSN   Вверх
Su_
  Дата 18.1.2010, 02:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата

Ты бы намекнул, что за исключение.

Мне его пока и не поймать, )Увидел это один раз только, и был не под программой,а вывод только в консоль шёл.

Цитата

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

Вот это хороший вопрос, которым я задался сразу, как запустить сервер в отдельной нити. На практике он не запускает его каждую секунду, он запускает его при первом входе в программу,управление передается  в метод OpenTCPSocet, в котором все крутится в цикле while(true).,тем самым не отдавая управление потоку. Т.Е ожидает сообщение, оно приходит , срабатывает accept, после обработки опять уходит на accept и так до бессконечностиsmile.. только когда, (по непонятной мне причине) ,вылетает исключение , он возвращается в 

Код

m_thr_tcp = new Thread() {
            @Override
       public void run()
       { 
                 while(true) {
                  prints(": "+"ТСП поток запущен ");
                    try {
                        OpenTCPSocet();       //<-------------------
                                                         // <--------------------переходит сюда
                    } catch (IOException ex) {
                        Logger.getLogger(Fire.class.getName()).log(Level.SEVERE, null, ex);
                    }
                  try {
            prints(": "+"*-*-*-*Ждем секунду,и перезапускаем*-*-*-*");
             Thread.sleep(1000); //<----------------------------ждет секнду
           }
           catch(Exception e)
           {
             
           }
           }} // <---------------------возвращаеться на while , который запускает OpenTcpSocet , который в свою очередь открывает порт, и ставит .accept в цикле while
     };


Результат такой , например работает сутки все нормально, потом исключение, возврат в поток, восстановление через секунду сокета на томже порту что и слетел.Работает дальше)

Это сообщение отредактировал(а) Su_ - 18.1.2010, 03:06


--------------------
user posted image

PM MAIL WWW   Вверх
Kangaroo
Дата 19.1.2010, 00:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


AA - Aussie Animal
****


Профиль
Группа: Участник Клуба
Сообщений: 2042
Регистрация: 7.10.2006
Где: US

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



Цитата(Su_ @  18.1.2010,  02:47 Найти цитируемый пост)
На практике он не запускает его каждую секунду, он запускает его при первом входе в ... 

Ага, понятно. Проглядел я.


Цитата(Su_ @  18.1.2010,  02:47 Найти цитируемый пост)
Увидел это один раз только, и был не под программой,а вывод только в консоль шёл.

Значит пиши логи в файл и потом сюда, так сложно догадаться.


--------------------
Lost....
PM MAIL MSN   Вверх
Su_
Дата 19.1.2010, 03:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Поймал) на медленном интернете правда в отладчике 

Код

java.net.SocketException: Connection reset



--------------------
user posted image

PM MAIL WWW   Вверх
Su_
Дата 3.2.2010, 17:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



темка умерла походу( Может ошибка не в коде , тогда хотелось бы уточнить - организация самого слушателя порта ,правильная?


--------------------
user posted image

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

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

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


 




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


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

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