0

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.

+0

Bitte kommentieren Sie mich, wenn Sie nicht klar sind. – Nas

Antwort

0

ich dieses Problem aus der unten fixiert. Es gibt kein Problem mit der Paketweiterleitung im Netzwerk. Ich sende und empfange Broadcast auf dem gleichen Socket-Objekt mit SetBroadcast Wert True. So Socket Send Broadcast und hören für jede Sendung aus dem gleichen. Sie sollten kein anderes Socket-Objekt zum Abhören von Broadcasts verwenden. Ich verstehe es sehr spät.

public class PacketSender extends Thread { 
     @Override 
     public void run() { 
      DatagramSocket sendSoc = null; 
      try { 
       sendSoc = new DatagramSocket(); 
       sendSoc.setBroadcast(true); 
       InetSocketAddress address = new InetSocketAddress(getBroadcastQuadIp(), PORT); 

       byte[] ip = prop.ToBuffer(); 
       DatagramPacket packet = new DatagramPacket(ip, 
         ip.length, address.getAddress(), address.getPort()); 


       sendSoc.send(packet);  

       //////////// receiver begin 
       int i = 0; 
       while (true) { 

        i++; 

        final byte buf[] = new byte[1024]; 
        final DatagramPacket pack = new DatagramPacket(buf, buf.length); 
        try { 
         sendSoc.receive(pack); 

         String message = new String(pack.getData()).trim(); 

         Log.i("test", message + " server ip : " + pack.getAddress().getHostAddress()); 

        } catch (UnknownHostException e) { 
         e.printStackTrace(); 

        } 
       } 
      } catch (IOException e) { 
       Log.d("Send", "IOException"); 
       e.printStackTrace(); 
       if (sendSoc != null) 
        sendSoc.close(); 
      } 
     } 
    } 
0

Nehmen Sie diese Änderungen an Ihrem Code:

public class PacketSender implements Runnable { 

    @Override 
    public void run() { 

     // ... 

     DatagramPacket packet = new DatagramPacket(ip, 
       ip.length, InetAddress.getByName("255.255.255.255"), PORT); 

     // ... 
    } 
} 
public class PacketReceiver implements Runnable { 

    @Override 
    public void run() { 

     // ... 

     receiveSoc = new DatagramSocket(PORT, InetAddress.getByName("0.0.0.0")); 

     // ... 
    } 
} 

UPDATE

Der MyClientTask Code funktioniert nicht, weil sie den Absender und den Empfänger nacheinander aufruft. Der Absender wird an niemanden senden und der Empfänger wird ewig auf keine Nachricht warten. Sie müssen den Absender anrufen, während der Empfänger Datagramme gerade abhört.

Anstatt also

new MyClientTask().execute(); 

Sie werden etwas wollen, wie

new Thread(new PacketReceiver()).start(); 

// Just to make sure that the receiver has started up. 
// You'll want to do a different kind of synchronization. 
SystemClock.sleep(50); 

new Thread(new PacketSender()).start(); 
+0

danke für die Antwort. Es funktioniert nicht . Selbst wenn es keine msg sendet. Bevor es gut war. – Nas

+0

@Posten Sie den Code, der diese Runnables aufruft – nandsito

+0

@Nas haben Sie das Manifest Anwendungen-Erlaubnis Internet hinzufügen? – nandsito

Verwandte Themen