2015-10-10 3 views
0

У меня есть приложение для Android, которое контролирует UDP-пакеты и вызывает метод обработки полученного сообщения. У меня есть одна проблема, если входящее сообщение длиннее, это вызовет метод для обработки сообщения. Но если входящее сообщение короче, он не вызовет этот метод, но если я отправлю короткое сообщение дважды, он обработает или сразу отправит короткое сообщение после того, как длинное сообщение будет обработано. Как я могу это исправить? Мне нужно обрабатывать короткие и длинные сообщения.Android UDP-пакеты, как получать пакеты с переменным размером

Код приема UDP, который вызывает метод для длинного сообщения, но не для короткого сообщения;

 class Server extends Thread { 


    @Override 
    public void run() { 
     try { 
       int port = 8888; 
       // Create a socket to listen on the port. 
       dsocket = new DatagramSocket(port); 
       // Create a buffer to read datagrams into. 
       byte[] buffer = new byte[100]; 
      // Create a packet to receive data into the  buffer 
      DatagramPacket packet = new DatagramPacket(buffer, uffer.length); 
       while (true) { 
          try { 


       // Wait to receive a datagram 
        dsocket.receive(packet); 
        //Convert the contents to a string, 
    String msg = new String(buffer, packet.getOffset(), packet.getLength()); 
           if (msg !=null) 
           { 
            call(msg); 
            msg=null; 
           } 
         // Reset the length of the packet before reusing it. 
           packet.setLength(buffer.length); 



          } catch (Exception e) { 
            dsocket.close(); 
            break; } 
           } 

      } catch (Exception e) { 
       dsocket.close(); e.printStackTrace();} 

      } 
    } 


    public void call(String mg) { 
    int v; 
    int sq=0; // store squence no of the calls 
    int indxs=0; // start alarm msg index 

    boolean fnd; // alarm msg filter flg 
    char Sqchar1; // squnce no of the call 
    char Sqchar2; // squnce no of the call 
    char Sqchar3; // squnce no of the call 
    int pospri; // default position 8 of priority for one digit seqence no 
    String pstr = null; // alarm msg string without filter 
    boolean aflg =false; // alarm msg found flg becomes true 
     boolean retval = false; // stop same active sequence msg 
    int sqnum; // defualt sq to one digit 

    int lstr = mg.length(); 
     int indxe= lstr; // end alarm msg index 
// typica string mg = 145 ($\M A 1 5 "bla bla")// valid alarm msg 
// typical string mg = 88 ($\M A 12 6 "bla bla")// valid alarm msg 
// typical string mg = 127 ($\M A 123 1 "bla bla")// valid alarm msg 
// typical string mg = 1111 ($\M A 130 2 "bla bla")// valid alarm msg 
    // typical string mg = 148 ($\M N 1)// valid CANCEL msg 
    // typical string mg = 90 ($\M N 12)// valid CANCEL msg 
    // typical string mg = 130 ($\M N 123)// valid CANCEL msg 
    // typical string mg = 1115 ($\M N 130)// valid CANCEL msg 

    // NON Valid string mg = 456 
    // NON Valid string mg = 113 ($\C x n " bla bla") 

    //serach for alarm string 
    for(int i=0; i< lstr; i++) 
    { 
     char schar = mg.charAt(i); 
     if(schar=='$') 
     { 

      rHandler.post(rRunnable); 
      pstr = mg.substring(i, (lstr-1)); 
      aflg =true; break; 
     } 
     } 

     if(aflg) 
     { 
     char achar = pstr.charAt(2); // indicateas alarm msg 
     char ACchar = pstr.charAt(4); // indicateas alarm active 

     if(achar =='M' && ACchar == 'A') 
     { 
      Sqchar1= pstr.charAt(6); 
      if(pstr.charAt(7)!=' ') 
      { 
       sqnum=2; 
       Sqchar2= pstr.charAt(7); 
       pospri = 9; 
      } 
      else 
      { 
       sqnum=1; 
       Sqchar2=' '; 
       pospri = 8; 
       sq = Character.getNumericValue(Sqchar1); 

      } 

      if(sqnum==2) 
      { 
       if(pstr.charAt(8)!=' ') 
       { 
        //squnum =3 

        pospri = 10; 
        Sqchar3= pstr.charAt(8); 
        int sq1 = Character.getNumericValue(Sqchar1); 
        int sq2 = Character.getNumericValue(Sqchar2); 
        int sq3 = Character.getNumericValue(Sqchar3); 
        sq= (sq1 * 100) + (sq2 * 10) + sq3; 

       } 
       else 
       { 
        int sq1 = Character.getNumericValue(Sqchar1); 
        int sq2 = Character.getNumericValue(Sqchar2); 
        sq= (sq1 *10) + sq2; 
        pospri = 9; 
       } 
      } 

      int plen = pstr.length(); 
      fnd=false; 
      for(int x=0; x<plen; x++) 
      { 
       char ichar = pstr.charAt(x); 
       if(ichar== '"' && !fnd) 
       { 
        indxs = x+1; fnd = true; 
       } 
       else 
       if(ichar == '"' && fnd) 
       { 
        indxe = x; break; 
       } 
      } 



      String amsg = pstr.substring(indxs, indxe); 
      // stop repetated msgs 
      if(sqlist[sq]== sq) 
      { 
       retval = true; 
      } 

      if (!retval) 
      { 
       sqlist[sq] = sq; 
       alarmlist[sq] = amsg; 
       clrlist[sq]=Character.toString(pstr.charAt(pospri)); 
       sound(clrlist[sq]); tHandler.post(tRunnable); 

      } 
      } 
      else 
      if(achar =='M'&& ACchar == 'N') 
      { 
      int clen =pstr.length(); 
      if(clen ==7) 
      { 
       Sqchar1= pstr.charAt(6); 
       sq= Character.getNumericValue(Sqchar1); 
      } 
      else 
      if(clen ==8) 
      { 
       Sqchar1= pstr.charAt(6); 
       Sqchar2= pstr.charAt(7); 
       int sq1 = Character.getNumericValue(Sqchar1); 
       int sq2 = Character.getNumericValue(Sqchar2); 
       sq= (sq1 * 10) + sq2; 
      } 
      else 
      if(clen ==9) 
      { 
       Sqchar1= pstr.charAt(6); 
       Sqchar2= pstr.charAt(7); 
       Sqchar3= pstr.charAt(8); 
       int sq1 = Character.getNumericValue(Sqchar1); 
       int sq2 = Character.getNumericValue(Sqchar2); 
       int sq3 = Character.getNumericValue(Sqchar3); 
       sq= (sq1 * 100) + (sq2 * 10) + sq3; 
      } 



      sqlist[sq] = 0; 
      alarmlist[sq] = null; 
      clrlist[sq]= null; cHandler.post(cRunnable); 

     } 
     else 
     { 
      return; 
     } 


      list.clear(); 

      int elementsCount = alarmlist.length; 
      v=0; 
      for(int i=0; i < elementsCount; i++) 
      { 
       String disp =alarmlist[i]; 
       if(disp != null) 
       { 

        list.add(v, disp+ "#" + clrlist[i]); 
        v++; 
       } 
      } 
      write(list, "/mnt/sdcard/msg.tmp"); dHandler.post(dRunnable); 
     } //alarm msg 


    return; 
    } 
+0

Ваш код не имеет смысла; и ваш код не ведет себя так, как описано. 'msg' не может быть пустым в том месте, где вы его тестируете; и в этом коде нет ничего чувствительного к длине сообщения по-разному. – EJP

+0

Да, вы правы. После публикации вопроса я пытался его решить. Кажется, что-то не так с моим методом void. Когда условия в методах не выполняются, он не возвращается к вызывающему потоку. Поэтому я собираюсь добавить пустой оператор return и попробовать. – Jro

+0

HI EJP, Тем не менее я не мог решить проблему. Я отправляю этот метод. Можете ли вы проверить, что в логике или что-то не так. Просто сообщите, что я новичок в Java и Android. – Jro

ответ

0

Я нашел проблему. Это ничего не значит с этим кодом. Это происходит с тем, как я отправлял пакеты UDP. Я написал программу на C++ для отправки UDP-пакетов, и у меня была ошибка, когда я отправлял короткие сообщения. Как только я его исправил, приложение работает нормально.

Смежные вопросы