2015-04-14 2 views
1

Всегда могу получить первый пакет udp, но когда я получу второй пакет udp, DatagramPacket всегда будет частью последнего пакета.Сокет всегда получает последний принятый пакет udp

, например: мне нужно получить в первом пакете: "AAAAAAAAAA" я получаю: "AAAAAAAAAA"

Мне нужно получить во втором пакете: "BBBB" Я получаю: "BBBBAAAA".

Как я могу очистить, стереть или другой способ решить мою проблему?

Вот мой код:

public DatagramServer(Context c, Activity a) throws SocketException { 
     setSocket(new DatagramSocket(Constantes.UDP_PORT)); 
     getSocket().setBroadcast(true);  
     getSocket().setReuseAddress(true); 
     setContext(c); 
     setActivity(a); 
     Thread thread = new Thread(new Runnable() { 
     @Override 
      public void run() { 
       try { 
        receivePacket(); 
       } catch (IOException e) { 
        e.printStackTrace(); 
       } 
      } 
     }); 

     thread.start(); 

    } 

public void receivePacket() throws IOException { 
     byte[] buf = null; 
     buf = new byte[Constantes.PACKETSIZE]; 
     final DatagramPacket packet = new DatagramPacket(buf, buf.length); 

     while (true) { 

      getSocket().receive(packet); 

      Handler mainHandler = new Handler(getContext().getMainLooper()); 
      Runnable myRunnable = new Runnable() { 
       @Override 
       public void run() { 
        byte[] resposta = packet.getData(); 
        try { 
         Thread.sleep(200); 
        } catch (InterruptedException e1) { 
         e1.printStackTrace(); 
        } 
        if (resposta[0] == 111) { 

         if (GlobalSingleton.getInstance().is_pode_reconhecer_central()){ 

          final CentralDAO cDAO = new CentralDAO(getContext()); 

          final Central central = new Central(); 
          Central centralExistente = new Central(); 
          Boolean bcentralExiste = false; 
          central.set_IP(packet.getAddress().getHostAddress()); 
          central.set_mac(CentralService.getMAC(packet.getData())); 
          central.set_modificado(true); 
          central.set_ativo(true); 


          } 
          else { 
           centralExistente.set_IP(packet.getAddress().getHostAddress()); 
           centralExistente.set_ativo(true); 

           for (int i=0;i<lvCentrais.getCount();i++){ 
            Central centrallv = (Central) lvCentrais.getItemAtPosition(i); 
            if (centrallv.get_mac().equals(centralExistente.get_mac())){ 
             centrallv.set_IP(centralExistente.get_IP()); 
             centrallv.set_ativo(centralExistente.is_ativo()); 
            } 
           } 

          } 

          GlobalSingleton.getInstance().set_pode_reconhecer_central(false); 
         } 

        } else { 
         String respostaString = ""; 
         try { 
          respostaString = new String(packet.getData(),"ASCII"); 
         } catch (UnsupportedEncodingException e) { 
          e.printStackTrace(); 
         }//new String(packet.getData(),packet.getOffset(),packet.getLength());// 

         if (respostaString.toUpperCase().contains(Constantes.ANSWER_DEVICE)) { 

          if (GlobalSingleton.getInstance().is_pode_reconhecer_dispositivo()){ 

           final GeradorDAO gerDAO = new GeradorDAO(getContext()); 
           final DispositivoDAO dDAO = new DispositivoDAO(getContext()); 

           List<Gerador> list = gerDAO.selectAll(); 

           if (list.size()>0){ 

            int mac,versao,tipo; 

            String values[] = Utils.getValorString(respostaString, Constantes.P_COMA, Constantes.P_INDICADOR); 

            mac = Integer.parseInt(values[0].trim()); 
            tipo = Integer.parseInt(values[1].trim()); 
            versao = Integer.parseInt(values[2].trim()); 

            if (dDAO.selectOne(mac, GlobalSingleton.getInstance().get_current_central().get_id()) == null){ 

             final Gerador gerador = gerDAO.selectOne(tipo, versao);         
             final Dispositivo dispNovo = new Dispositivo(GlobalSingleton.getInstance().get_current_central().get_id()); 

             dispNovo.set_mac(mac); 
             dispNovo.set_tipo(tipo); 
             dispNovo.set_versao(versao); 

             dispNovo.set_nome(gerador.get_nome_dispositivo()); 


            } 
            else{ 
             Toast.makeText(getContext(), "Dispositivo já existe", Toast.LENGTH_SHORT).show(); 
            }      

           } 

           GlobalSingleton.getInstance().set_pode_reconhecer_dispositivo(false); 
          }       
         } 

        }    
       } 
      }; 
      mainHandler.post(myRunnable); 

     } 
    } 

Я новичок в Android, пожалуйста, если вы можете помочь мне, я буду благодарен!

ответ

1

Вы не обращая внимания на длину в DatagramPacket.

central.set_mac(CentralService.getMAC(packet.getData())) 

должно быть что-то вроде

central.set_mac(CentralService.getMAC(packet.getData(), packet.getOffset(), packet.getLength())) 

предполагая метод getMac() принимает эти параметры. В противном случае вам придется самостоятельно создать массив байтов соответствующего размера.

EDIT Я не собираюсь повторять, что для любого другого использования packet.getData().

+0

Хорошо, но, central.set_mac («») запустить в первом пакете. Во втором пакете выполните следующее: dispNovo.set_versao (versao); и он получает первую строку. Ты понимаешь? –

+1

Неприменимо. В вашем вопросе говорится, что вы получаете часть первой дейтаграммы в конце второй дейтаграммы, и я сказал вам, почему. Не используйте только массив байтов, с которым вы создали дейтаграмму, используйте его смещение и длину. – EJP

+0

Хорошо. Я попробовал свой ответ в 'respostaString' var, но' respostaString' пуст (""), когда я использую respostaString = new String (packet.getData(), packet.getOffset(), packet.getLength(), "ASCII") ; –

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