2016-04-10 9 views
0

で関数を受信します。私はWindows用のC#とAndroid用のクライアントアプリケーションのサーバーアプリケーションを持っています。奇妙な行動は、私はそれについて学ぶためにUDPのテストを実施しようとしているAndroidの

私は自家製の発見サービスを実装しようとしています。サーバーは固定ストリング( "LazyRemote")でUDPパッケージを継続的にリッスンしています。それはその文字列を受信した場合には、クライアント(「LazyRemote_192.168.1.17:2016」)に、別の文字列を送信し 私は両方の方向に送信されたデータが正確であることのwiresharkでチェックしましたが、私はクライアントアプリケーションで間違った何かを受けています。

アンドロイドのためのコードはこれです:

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

問題は、機能が働いているが、それは間違ったデータを受信して​​いる受信ことです。 (クライアントがサーバに送信して、descovery( "LazyRemote")を初期化するのと同じ文字列を受け取ります)。

それは愚かな間違いでなければなりませんが、私はそれを解決することはできません。どうもありがとう。あなたはあなたが送信されているのと同じポートで待機している場合

+0

可能性のある重複した[受信UDPメッセージが不正な長さを持っている](http://stackoverflow.com/questions/36533359/received-udp-message-has-incorrect-length) – EJP

+0

問題はな長さではありません。私は送られていない何かを受け取る。私はバッファと関連していると思うが、見つけられない。 – Aldridge1991

答えて

0

あなたのUDP送信されたパケットはまた、あなたのクライアントソケットで受けることができます。データ分析コードからそのデータをフィルタリングするだけで済みます。送信元アドレスがクライアントのIPアドレスと同じであることがわかるはずです。

関連する問題