私はサーバーとして機能する組み込み機器と通信するためのアンドロイドソース(ただし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です。しかし、まだ、私は唯一のハートビートバイトを取得します。私は何が失われますか?
データグラムを特定のアドレスとポートに送信していませんか?これらのデバイスは、常に同じネットワーク内にあることが保証されています。 「デバイスの実際のIPアドレス」はどういう意味ですか? – March3April4
ブロードキャストアドレスである192.168.5.255に送信しています。 「デバイスの実際のIPアドレス」はそれ以上の明確化を必要としないようです。 – EJP
これはなぜ起こったのだろうか。私は255がブロードキャストアドレスであることを知らなかった。どうもありがとうございました。もう1つの質問。ブロードキャストを受信したときに実際の送信者のIPアドレスから知ることはできますか?デバイスは、5秒ごとにハートビートバイトを送信します。 – March3April4