こんにちは、特定のポート番号でDatagramSocketを使用してブロードキャストを送信しています。正常にメッセージを送信します。しかし、私は開いているIPアドレスと任意のポート番号を受信メッセージをlistenするときにそれはsockettimeoutoutceptionを投げている。しかし、同じネットワークに接続されています。任意のIPと任意のポート番号を持つデータグラムソケットを聞くandroid
//マニフェスト
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
<uses-permission android:name="android.permission.CHANGE_WIFI_STATE" />
<uses-permission android:name="android.permission.CHANGE_NETWORK_STATE" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
//定義されているポート番号、グローバル非同期タスクを開始
int PORT=2739;
//
new MyClientTask().execute();
///非同期タスク
public class MyClientTask extends AsyncTask<Void, Void, Void> {
@Override
protected Void doInBackground(Void... arg0) {
new PacketSender().run();
new PacketReceiver().run();
return null;
}
@Override
protected void onPostExecute(Void result) {
super.onPostExecute(result);
}
}
これは、これは私のリスニング要求
public class PacketReceiver implements Runnable {
@Override
public void run() {
DatagramSocket receiveSoc = null;
try {
//here 0 represent any port number including system reserved port number
receiveSoc = new DatagramSocket(0, InetAddress.getByName("0.0.0.0"));
receiveSoc.setBroadcast(false); //also tried with true
receiveSoc.setSoTimeout(5000); //alse tried with removing timeout value
int i = 0;
while (true) {
Log.d("data value", " " + i);
i++;
byte buf[] = new byte[1024];
DatagramPacket pack = new DatagramPacket(buf, buf.length);
try {
receiveSoc.receive(pack);
String message = new String(pack.getData()).trim();
Log.i("test", message + " server ip : " + pack.getAddress().getHostAddress());
} catch (UnknownHostException e) {
e.printStackTrace();
}
}
} catch (SocketTimeoutException e) {
Log.d("Main", "SocketTimeoutException");
e.printStackTrace();
receiveSoc.close();
new PacketReceiver().run();
} catch (IOException e) {
// TODO Auto-generated catch block
Log.d("Response", "IOException");
e.printStackTrace();
}
}
}
が// IP
public InetAddress getBroadcastIp() throws IOException {
DhcpInfo dhcp = myWifiManager.getDhcpInfo();
int broadcast = (dhcp.ipAddress & dhcp.netmask) | ~dhcp.netmask;
byte[] quads = new byte[4];
for (int k = 0; k < 4; k++)
quads[k] = (byte) ((broadcast >> k * 8) & 0xFF);
return InetAddress.getByAddress(quads);
}
それは内のすべてのホストからのブロードキャストメッセージを受信することができる放送ばかりである私の要求送信
public class PacketSender implements Runnable {
@Override
public void run() {
DatagramSocket sendSoc = null;
try {
sendSoc = new DatagramSocket();
sendSoc.setBroadcast(true);
sendSoc.setSoTimeout(5000);
sendSoc.setReuseAddress(true);
byte[] ip = prop.ToBuffer();
DatagramPacket packet = new DatagramPacket(ip,
ip.length, getBroadcastIp(), PORT);
Log.d("Sending", packet.getAddress().getHostAddress() + " " + packet.getPort());
sendSoc.send(packet);
sendSoc.close();
} catch (IOException e) {
Log.d("Send", "IOException");
e.printStackTrace();
if (sendSoc != null)
sendSoc.close();
}
}
}
です私が通信したいハードウェア以外のLAN。私はそれに放送を送ることができます。しかし、私はこの特定のデバイスから放送を受信することができません。
明確でない場合は、私にコメントしてください。 – Nas