2016-04-10 46 views
0

Bu konuda bilgi edinmek için bir UDP testi uygulamaya çalışıyorum. Windows için bir sunucu uygulaması ve Android için bir istemci uygulaması var.UDP'de Datagram ile garip davranışlar Android'de işlev alıyor

Ev yapımı bir keşif hizmeti uygulamaya çalışıyorum. Sunucu sürekli bir dize ("LazyRemote") ile UDP paketleri dinliyor. Bu dize aldığında, istemciye başka bir dize gönderir ("LazyRemote_192.168.1.17: 2016") wireshark ile her iki yönde gönderilen verilerin doğru olduğunu kontrol ettim ama istemci uygulamasında yanlış bir şey alıyorum .

android için kod şudur:

buttonConnect.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View arg0) { 

      progress.show(); 
      //This code is executed when user clicks connect button. As it could be a long running operation, it's executed in a new thread to avoid blocking UI 
      Thread thread = new Thread(new Runnable() { 
       @Override 
       public void run() { 

        String ipAddress = ""; 
        SocketClass my_socketClass = new SocketClass(); 
        InetAddress UDPaddress = my_socketClass.getBroadcastAddress(); 
        int UDPport = 15000; 

        if(initializationDone == false){ 
         initializationDone = true; 

         try { 
          socket_send = new DatagramSocket(); 
          socket_send.setBroadcast(true); 
          socket_send.setSoTimeout(6000); 
          socket_receive = new DatagramSocket(UDPport, InetAddress.getByName("0.0.0.0")); 
         } catch (Exception e) { 
          e.printStackTrace(); 
         } 
        } 

        try { 

         byte[] send_buff = "LazyRemote".getBytes(); 
         DatagramPacket sendPacket = new DatagramPacket(send_buff, send_buff.length,UDPaddress,UDPport); 
         socket_send.send(sendPacket); 

        }catch (Exception ex){ 

         showToast("Imposible enviar primer ack"); 
        } 


        byte[] receive_buff = new byte[30]; 
        DatagramPacket receivePacket = new DatagramPacket(receive_buff, receive_buff.length); 

        try { 

         socket_receive.receive(receivePacket); 
         String receivedData = new String(receivePacket.getData(), "UTF-8"); 
         if (receivedData.contains("LazyRemote")) { 


          SocketClass my_socket = new SocketClass(receivePacket.getAddress().toString().substring(1), 2016); 
          SocketClass.ConnectionStatus connectionStatus = my_socket.establishConnection(); 

          //Remove progressdialog after establishConnection finishes. 
          progress.dismiss(); 

          //Check connection status. 
          if (connectionStatus.status == true) { 

           Thread.sleep(1000); 
           socket_receive.close(); 
           socket_send.close(); 
           Intent intent = new Intent(MainActivity.this, ActionPerformer.class); 
           startActivity(intent); 
           finish(); 
          } 
         } 
        } catch (Exception ex) { 
         progress.dismiss(); 
         showToast("No se han encontrado servidores"); 
        } 
        //mLock.release(); 
       } 
      }); 
      thread.start(); 
     } 
    }); 

sorun o fonksiyonu çalışıyor ama yanlış veri aldığı alma olduğunu. (İstemcinin, sunucuyu descovery ("LazyRemote")) başlatması için gönderdiği aynı dizgiyi alıyor.

Aptal bir hata olmalı ama çözemiyorum. Çok teşekkürler.

+0

[Alınan UDP iletisinin yanlış uzunluğu var] olası kopyası (http://stackoverflow.com/questions/36533359/received-udp-message-has-incorrect-length) – EJP

+0

Sorun, uzunluk değil. Gönderilmeyen bir şey alıyorum. Bence tamponlarla ilgili bir şey ama onu bulamıyorum. – Aldridge1991

cevap

0

UDP tarafından gönderilen paketiniz, gönderdiğiniz aynı bağlantı noktasında dinliyorsanız, istemci soketiniz tarafından da alınabilir. Veri analiz kodunuzdan bu verileri filtrelemeniz yeterlidir. Kaynak adresinin istemci IP adresiyle aynı olduğunu görebilmelisiniz.