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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Чтение данных из openInputStream(); Как обнаружить конец потока? 
:(
    Опции темы
rob_an
Дата 30.1.2007, 21:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Вопрос вроде бы простой но тк с ним сталкиваюсь первый раз не получается...
Суть такова: открываю соединение с POP3 сервером, создаю входящий   is  = sc.openInputStream();
  и исход.  os = sc.openOutputStream();  потоки и начинаю общение по POP протоколу.
Вот подпорограмма чтения из потока:
Код

public String read_p()
    {
       int c = 0;
            
         StringBuffer sb = new StringBuffer();

       try
       {
          while ((c = is.read())!= '\n' && (c != -1))
          {
           sb.append((char) c);
          }
        } catch (IOException e) { ;  }

         
          c = 0;  // обнуляем конец сообщения
       
         return  sb.toString(); 
 
     }


Она работает, если сервер отвечает одной строкой. Если же ответ многострочный - то считывается только первая строка. ( это понятно, тк отловив "конец строки" (\n) - выходим из цикла.
Но как прочитать ответ сервера из нескольких строк?
Я думал, что можно отловить конец потока ( при считывании после конца - значение (-1) через исключения и вот этот код:
Код

public String read_p()
    {
       int c = 0;
            
         StringBuffer sb = new StringBuffer();

       try
       {
          while ((c = is.read())!= -1)
          {
           sb.append((char) c);
          }
        }  catch (InterruptedIOException ioe) {   
                                                            }  catch  (Exception ) { }

        
          c = 0;  // обнуляем конец сообщения
       
         return  sb.toString(); 
 
     }


Но я вылетаю по InterruptedIOException и входной поток закрывается ( а не надо!)
С исключениями сталкиваюсь первый раз, поэтому кому не трудно помогите - заранее спасибо!
PM MAIL   Вверх
W0LF
Дата 31.1.2007, 11:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


alexander lonsky
***


Профиль
Группа: Участник
Сообщений: 1164
Регистрация: 9.2.2006
Где: Ukraine.Dnepropet rovsk

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



Цитата

Но как прочитать ответ сервера из нескольких строк?

Поставь считывание до определенного символа.
Есть стандартный пример из WTK

Код

while (true) {
                StringBuffer sb = new StringBuffer();
                int c = 0;

                while (((c = is.read()) != '\n') && (c != -1)) {
                    sb.append((char) c);
                }

                if (c == -1) {
                    break;
                }

                // Display message to user
                si.setText("Message received - " + sb.toString());
} 

Смотрим, что здесь происходит - 
считываем поток до символа "\n", или до конца потока(-1 то есть прерванное соединение). Записываем это в буфер.
Далее проверяем - если 
Код

c == -1
(соединение оборвалось)
то выходим из общего цикла.
Иначе, если мы просто дошли до определенного символа, которым закрываются наши пакеты(это может быть любой символ по договоренности клиента и сервера),
то переходим снова к циклу - 
Код

while (((c = is.read()) != '\n') && (c != -1)) {
                    sb.append((char) c);
}

И если сервер пока не посылает более пакетов, то останавливаемся на методе 
Код

 is.read()

и ждем, пока не прийдет пакет.
Ну и так далее.
А вместо "\n", можешь попробовать так например - 
Код

while (((c = (byte)is.read()) != Byte.MIN_VALUE) && (c != -1)) {
...
}



--------------------
iOS developer
PM MAIL WWW Skype GTalk   Вверх
rob_an
Дата 1.2.2007, 22:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Да, мысль с вечным циклом - это наверное единственно правильное решение, но тогда придется создавать еще один Трейд.  Но надо еще подумать как из него передовать обратно в основную ветвь считанные строки ( считана может быть ведь и одна и несколько строк)???
PM MAIL   Вверх
W0LF
Дата 2.2.2007, 10:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


alexander lonsky
***


Профиль
Группа: Участник
Сообщений: 1164
Регистрация: 9.2.2006
Где: Ukraine.Dnepropet rovsk

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



Я же пишу - возьми пример из WTK, там это все в отдельном потоке, все синхронизировано


--------------------
iOS developer
PM MAIL WWW Skype GTalk   Вверх
rob_an
Дата 4.2.2007, 12:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Все получилось! Всем большое спасибо!
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса

  • Прежде чем задать вопрос прочтите это!
  • Литература по Java находится здесь.
  • Литературу по Java обсуждаем здесь.
  • Используйте теги [code=java][/code] для подсветки кода. Используйтe чекбокс "транслит" (возле кнопок кодов) если у Вас нет русских шрифтов.
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда

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


 




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


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

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