2016-04-10 5 views
0

Я пытаюсь реализовать тест UDP, чтобы узнать об этом. У меня есть серверное приложение в C# для windows и клиентское приложение для Android.Странное поведение с дейтаграммой в функции приема UDP в Android

Я пытаюсь внедрить услугу самообслуживания. Сервер постоянно прослушивает пакеты UDP с фиксированной строкой («LazyRemote»). Когда он получает эту строку, он отправляет клиенту другую строку («LazyRemote_192.168.1.17: 2016») Я проверил с помощью wirehark, что данные, отправленные в обоих направлениях, верны, но я получаю что-то неправильное в клиентском приложении ,

Код для Android заключается в следующем:

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(); 
     } 
    }); 

Проблема заключается в том, что получить функция работает, но он получает неверные данные. (Он получает ту же строку, что клиент отправляет серверу для инициализации обнаружения («LazyRemote»)).

Это должна быть глупая ошибка, но я не могу ее решить. Большое спасибо.

+0

Возможный дубликат [Полученное сообщение UDP имеет неправильную длину] (http://stackoverflow.com/questions/36533359/received-udp-message-has-incorrect-length) – EJP

+0

Проблема не в длине. Я получаю то, что не отправляется. Я думаю, что что-то связано с буферами, но я не могу его найти. – Aldridge1991

ответ

0

Ваш отправленный UDP-пакет также может быть получен вашим сокетом-клиентом, если вы слушаете тот же порт, который вы отправляете. Вам просто нужно отфильтровать данные из кода анализа данных. Вы должны уметь видеть, что исходный адрес совпадает с IP-адресом клиента.