Hallo Am Senden Broadcast mit DatagramSocket mit bestimmten Port-Nummer. Seine Nachricht erfolgreich gesendet. Aber wenn ich für Empfangsnachricht mit geöffneter IP-Adresse und irgendeiner Portnummer höre, wirft es sockettimeoutexception. Bin aber mit dem gleichen Netzwerk verbunden.Listening Datagramm-Socket mit einer beliebigen IP-Adresse und jeder Port-Nummer android
// manifest
<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" />
// definiert Portnummer global
int PORT=2739;
// Asynchron Aufgabe
new MyClientTask().execute();
/// async Aufgabe
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);
}
}
Start
Dies ist meine Anfrage zu senden
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();
}
}
}
Das ist mein Zuhören Anfrage
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 ausgestrahlt bekommen
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);
}
Es kann in der Lage Broadcast-Nachricht von allen Host erhalten in LAN außer der Hardware, die ich kommunizieren möchte. Ich kann Broadcast senden. Aber ich kann nicht von diesem bestimmten Gerät Broadcast empfangen.
Bitte kommentieren Sie mich, wenn Sie nicht klar sind. – Nas