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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Странное поведение сокета... 
:(
    Опции темы
Alone
Дата 22.12.2003, 14:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 663
Регистрация: 11.5.2003
Где: Dnepropetrovsk, U A

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



Имею вот такой кусок кода, который исполняется в отдельном треде:
Код

       while(i && !interrupted){
           String buf="";
           try{
               System.out.println("******************Wait TPKT data*********************");
               len=mainObj.conn.ReadTpkt();
               if ( len <= 0 ){
                   break;
               }
               buf=mainObj.conn.ReadMsg(len);
               System.out.println("READ: "+buf );
           }
           
           catch (Exception e){
               System.out.println("Error"+e.getMessage() );
           }
           
           if (buf.length()>0){
                   dispatcer(buf);
           }
           else{
               System.out.println("!!! ERROR !!!");
           }
           
           System.out.println(i+"-------------------------");
       }

На чистоту кода не претендую - вылизыванием буду заниматься потом.

Со стороны сервера отсылается N сообщений в спец. формате.
1пакет: 2 байта (длина сообщения)
2пакет: N байт (сообщение)

Со стороны клиента идет постоянное чтение сокета, причем, сначал читаются 2 байта, вычисляется размер, и потом ЖЕСТКО вычитываются нужное количество байт. Эта часть отработана.

Проблема вот в чем:
Клиент нормально воспринимает N-1 сообщений...
На последнем он ведет себя так, как будто ничего не прочитал из сокета...

Вдобавок привожу код чтения данных из сокета:

Чтение длины сообщения
Код

   public int ReadTpkt() {
       
       System.out.println("In ReadTpkt()");
       int result =-1;
       int[] i=new int[2];
       byte[] c=new byte[2];
       try{
           byteReader.read(c, 0, 2);
       }catch (Exception e){
           System.out.println("ReadTpkt() failed"+e.getMessage());
           return -1;
       }
       
       i[0]=c[0];
       i[1]=( c[1] <0 ? i[1]=c[1]+256 : c[1] );

       result=i[0]*256+i[1];
       System.out.println("Need read "+result+" bytes");
       return result;
   }



Чтение сообщения
Код

   public String ReadMsg(int len) throws Exception{
       System.out.println("In ReadMsg()");
       
       boolean res=false;
       
       int count=len;
       int rec_len=0;
       int offset=0;
       String buffer=new String();
       char buf1[]= new char[len];
       
       
       while (count > 0) {
           rec_len=theReader.read(buf1, offset, count);
           System.out.println("rec_len="+rec_len);
           
           if ( rec_len<0 ) {
               len=-1;
               System.out.println("len=-1, break");
               break;
           }
           
           if ( rec_len == 0) {
               len -= count;
               System.out.println("len=0, break");
               break;
           }
           System.out.println("Считано: "+rec_len);
           count -=rec_len;
           offset+=rec_len;
       }
       
       for (int i=0; i<buf1.length; i++){
           buffer+=buf1[i];
       }
       
       System.out.println("read len="+buffer.length());
       System.out.println("buffer="+buffer);
       
       return buffer;
   }





--------------------
web developer/telecommunication specialist.
mailto: [email protected]
ICQ#28442924

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

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

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


 




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


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

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