2016-10-07 13 views
0

私はサーバーとして機能する組み込み機器と通信するためのアンドロイドソース(ただしjavaのみ)を作成しています。バイトをエコーするJava UDPソケット

私は、デバイスの状態の変化を観察することができますので、私のUDPデータグラムがデバイスに到着していることを確信しています。

しかし、問題は私がサーバーから応答を得ることに失敗していることです。何も受け取っていない、しかし私はちょうど私が送ったのエコーを取得します。私のソースは以下の通りです。

public void sendSnapShot(View view) { 
//send a udp datagram to the server. 
    new AsyncTask<Void, Void, Void>() { 
     @Override 
     protected Void doInBackground(Void... voids) { 

      try { 
       Log.e("Test", "send sendSnapShot onLine"); 

       DatagramSocket clientSocket = new DatagramSocket(); 

       byte[] sendData = new byte[1024]; 

       String sentence = "$SNAPSHOT"; 

       sendData = sentence.getBytes(); 


       DatagramPacket sendPacket = new DatagramPacket(sendData, sendData.length, InetAddress.getByName("192.168.5.255"), 9999); 
       clientSocket.send(sendPacket); 

       Log.e("Test", "Sent sendSnapShot REQUEST"); 

      } catch (Exception e) { 
       Log.e("Test", "e", e); 
      } 

      return null; 
     } 
    }.execute(); 
} 

上記のコードは、データグラムをサーバーに転送することについてのものです。アプリケーションの開始時に、以下のスレッドが開始され、サーバーが送信したデータグラムを待ち受けます。

private class ListenerThread implements Runnable { 
    //listen for incoming datagrams. 
     @Override 
     public void run() { 
      DatagramSocket serverSocket = null; 
      try { 
      InetAddress serverAddr = InetAddress.getByName("192.168.5.255"); 
      serverSocket = new DatagramSocket(9999, serverAddr); 

      while (true) { 
       try { 

        byte[] receiveData = new byte[1024]; 

        DatagramPacket receivePacket = new DatagramPacket(receiveData, receiveData.length); 
        serverSocket.receive(receivePacket); 
        receivePacket.getLength(); 
        String receivedData = new String(receivePacket.getData(), 0, receivePacket.getLength()); 
        if (!receivedData.startsWith("!HEARTBEAT")) { 
         Log.e("Test", "Received : " + receivedData); 
        } else { 
         Log.e("Test", "Received : HEARTBEAT"); 
        } 
       } catch (Exception e) { 
        Log.e("Test", "FROM SERVER ", e); 

       } 
      } 
} catch (Exception e) { 
      Log.e("Test", "Exception", e); 
      } 
     } 
    } 

(おそらくC++で書かれて)サーバコードを書いた男は、彼が彼のテストケースでの応答を取得しているので、私は何が欠けすることができることを言いますか?上記のコードがサーバからのデータグラムを無視し、私のコードから送られたエコーバイトが存在する可能性はありますか?

============================================== ===============================

私は答えに応じて私のコードを変更しました。私はもはやリスニングスレッドをもう使用しません。ここに私のコードです。

public void sendBattery(View view) { 
     new AsyncTask<Void, Void, Void>() { 
     @Override 
     protected Void doInBackground(Void... voids) { 

      try { 
       Log.e("Test", "send Battery onLine"); 

       DatagramSocket clientSocket = new DatagramSocket(9999, InetAddress.getByName("0.0.0.0")); 

       byte[] sendData = new byte[1024]; 
       byte[] receivedata = new byte[1024]; 

       String sentence = "$S0B255"; 
       DatagramPacket receivePacket = new DatagramPacket(receivedata, receivedata.length); 

       sendData = sentence.getBytes(); 
       String receivedData = " "; 
       DatagramPacket sendPacket = new DatagramPacket(sendData, sendData.length, InetAddress.getByName("192.168.5.1"), 9999); 
       clientSocket.send(sendPacket); 
       do{ 
        clientSocket.receive(receivePacket); 
        receivedData = new String(receivePacket.getData(), 0, receivePacket.getLength()); 
        Log.e("Test", receivedData + ", IP CHECK Sender: : " + receivePacket.getAddress().toString() + ", port : "+ receivePacket.getPort()); 
       }while(true); 
       // Log.e("Test", "Sent BATTERY REQUEST COMPL"); 
      } catch (Exception e) { 
       Log.e("Test", "e", e); 
      } 

      return null; 
     } 
    }.execute(); 
} 

ハートビートバイトによると、私が受けたよ(それは「!HEARTBEAT」になります文字列にそれを作る)、送信者は192.168.5.1です。しかし、まだ、私は唯一のハートビートバイトを取得します。私は何が失われますか?

答えて

1
  • (192.168.5.255へ)ブロードキャストしているため、自分のデータグラムを受信して​​います。デバイスの実際のIPアドレスを使用する必要があります。
  • 送信ごとに新しいデータグラムソケットを作成しないでください。ソケットを閉じているわけではありませんので、ソケットも漏れています。
  • 受信しているのと同じソケットからデータグラムを送信する必要があります。デバイスは、リクエストが来たIP:ポートに返信する必要があります(現在は毎回異なります)、そのポートにバインドされている送信ソケットが失われていて、送信IP:ポートはIPではありません:あなたが聞いているポートなので、聞こえません。
  • リスニングソケットは特定のIPアドレスにバインドしないでください。ブロードキャストアドレスには接続しないでください。私はそれが動作して驚いています。
+0

データグラムを特定のアドレスとポートに送信していませんか?これらのデバイスは、常に同じネットワーク内にあることが保証されています。 「デバイスの実際のIPアドレス」はどういう意味ですか? – March3April4

+0

ブロードキャストアドレスである192.168.5.255に送信しています。 「デバイスの実際のIPアドレス」はそれ以上の明確化を必要としないようです。 – EJP

+0

これはなぜ起こったのだろうか。私は255がブロードキャストアドレスであることを知らなかった。どうもありがとうございました。もう1つの質問。ブロードキャストを受信したときに実際の送信者のIPアドレスから知ることはできますか?デバイスは、5秒ごとにハートビートバイトを送信します。 – March3April4

0

すべてについて正しかった何EJPを言っていました。

上記固定コード彼は自分で任意の放送を受信することなく、動作しますからヒントを含む(コードスニペット以下の最も)。

私はまだ、デバイスからの応答を取得できませんでしたので、問題は未解決だと思ったが、それは誤動作だった(私がなされていない)デバイスでした。上記のコードはうまくいくでしょう。

関連する問題