Autore Topic: Socket multicast con ip broadcast  (Letto 962 volte)

Offline lz91

  • Nuovo arrivato
  • *
  • Post: 37
  • Respect: +1
    • Mostra profilo
  • Dispositivo Android:
    Samsung Galaxy S I-9000
  • Sistema operativo:
    Ubuntu, Windows 7
Socket multicast con ip broadcast
« il: 03 Aprile 2013, 17:52:26 CEST »
0
Ciao ragazzi
e da un paio di giorni che sto sperimentando con i socket in Android.
Io volevo creare un applicazione java sul pc che inviasse dei pacchetti ai vari client Android.
Mi spiego meglio. Devo inviare una stessa informazione a più client nella stessa rete.
Ora volevo sapere una cosa sui Socket multicast .... per inviare un stesso pacchetto a piu' client android, il server deve sapere gli ip di tutti i client ? :D
o basta creare un gruppo nei socket multicast con l'indirizzo ip di broadcast ???
Es.
Codice: [Seleziona]
im = InetAddress.getByName( "INDIRIZZO DI BROADCAST" );
socket = new MulticastSocket(7777);
socket.joinGroup(im)



Per ora il mio server deve solo inviare pacchetti, il client riceve e per farlo sto usando il protocollo UDP.

Offline brissio

  • Nuovo arrivato
  • *
  • Post: 35
  • Respect: +6
    • Mostra profilo
Re:Socket multicast con ip broadcast
« Risposta #1 il: 03 Aprile 2013, 18:04:54 CEST »
+1
Dipende dal socket e dal protocollo che vai ad utilizzare.
Se la connessione è tcp si, ma sai già quali sono i terminali connessi, altrimenti se per esempio la 'connessione' è udp non sai nulla su chi ci sarà in ascolto quindi devi usare l'indirizzo di broadcast

Offline lz91

  • Nuovo arrivato
  • *
  • Post: 37
  • Respect: +1
    • Mostra profilo
  • Dispositivo Android:
    Samsung Galaxy S I-9000
  • Sistema operativo:
    Ubuntu, Windows 7
Re:Socket multicast con ip broadcast
« Risposta #2 il: 03 Aprile 2013, 20:35:50 CEST »
0
Si si voglio usare UDP.
Percio' dovro usare socket UDP e come indirizzo ip sia dal lato server che dal client deve mettere ip di broadcast .. giusto?


Post unito: 03 Aprile 2013, 21:06:28 CEST

Sto provando ora a fare un applicazione server in java per pc e client in Android.
In parte mi funzione, ma mi compare un problema

classe Server (non contiene il main perche gestita da interfaccia grafica)
Codice (Java): [Seleziona]
public  class Server implements Runnable
        {

          private Packet object;
          private DatagramSocket socket = null;
      private DatagramPacket packet = null;
         
      public void setPacket(Packet p ){
          this.object = p;
      }
     
     
      @Override
          public void run() {
                       
          int i=0;
        // Cicla finche il Thread non viene interrotto dall'utente attraverso la gui
                while(!Thread.currentThread().isInterrupted()){

                try {
               
                        byte[] buf = new byte[55555];
                       
                        buf = object.toString().getBytes();
                        String s = new String(buf, 0, buf.length);
                       
                        s="ci"+i+"_";
                       
                        System.out.println("Sto inviando il seguente messaggio: " + s+ " byte:"+s.length());
                       
                       
                       
                        socket = new DatagramSocket();
                       

                        //inserisco Ip broadcast
                        InetAddress multi = InetAddress.getByName("192.168.1.255");
           
                     packet = new DatagramPacket(s.getBytes(), s.getBytes().length, multi, 7777);

                   //spedisco pacchetto
                   socket.send(packet);            
                   Thread.sleep(1000);
           
            i++;
                }catch (IOException e) {
                    e.printStackTrace();
                        } catch (InterruptedException e) {
                                Thread.currentThread().interrupt();
                        }
                }      
          }    
}

Client Android metodo onStart()
Codice (Java): [Seleziona]
/** Lifecycle method: Called when the activity is becoming visible to user. */
    @Override
    protected void onStart(){
        super.onStart();               
               
                new Thread(new Runnable(){
                        @Override
                        public void run(){
                               
                                while(true){

                                        try {
                                                im = InetAddress.getByName("192.168.1.255");
                                        }
                                        catch (UnknownHostException e){
                                                Log.d("UDP", "Indirizzo Multicast non valido");
                                               
                                        } catch (IOException e) {
                                                // TODO Auto-generated catch block
                                                e.printStackTrace();
                                        }
                               
                                final byte[] buf = new byte[5];
                                       
                                        try
                                        {              
                                                socket = new MulticastSocket(7777);
                                                socket.joinGroup(im);
                                       
                                                Log.d("CLIENT", "HO CREATO SOCKET");           
                                        }
                                        catch (IOException e) {
                                       
                                                System.out.println(e.getMessage());
                                        }
                                               
                                       
                                        p =new DatagramPacket(buf, buf.length);
                                        Log.d("CLIENT","In ascolto");
                                       
                                        try {
                                                //lowerDialog.setText("In ascolto...");

                                                socket.receive(p);
                                               
                                               

                                        } catch (IOException e) {
                                                // TODO Auto-generated catch block
                                                e.printStackTrace();
                                        }
                                               
                                        Log.d("CLIENT","HO RICEVUTO IL PACCHETTO " + p.getLength() + " bytes from " + p.getAddress());
                                       
                                        byte[] data = p.getData();
                                        temp = new String(data, 0, data.length);
                                        temp2 = Arrays.toString(data);
                                       
                                        //lowerDialog.setText(temp);

                                        Log.d("CLIENT","Dati temp:" + temp + "\nDati2:" + temp2);
                                       
                                        try {
                                                socket.leaveGroup(im);
                                        } catch (IOException e1) {
                                                // TODO Auto-generated catch block
                                                e1.printStackTrace();
                                        }
                                        socket.close();
                                        try {
                                                //Gestire la pausa
                                                Thread.sleep(1000);
                                        } catch (InterruptedException e) {
                                                // TODO Auto-generated catch block
                                                e.printStackTrace();
                                        }
                                }
                        }      
                }).start();
    }
   

ho cercato di fare una cosa veloce e so che il codice è sporco però mi da un warning nei logcat che non capisco
ed è questo :
Codice: [Seleziona]
04-03 21:00:40.489: I/System.out(20943): Not a multicast group: /192.168.1.255
04-03 21:00:40.489: D/CLIENT(20943): In ascolto
04-03 21:00:41.333: D/CLIENT(20943): HO RICEVUTO IL PACCHETTO 5 bytes from /192.168.1.2
04-03 21:00:41.333: D/CLIENT(20943): Dati temp:ci289
04-03 21:00:41.333: D/CLIENT(20943): Dati2:[99, 105, 50, 56, 57]
04-03 21:00:41.333: W/System.err(20943): java.io.IOException: Not a multicast group: /192.168.1.255
04-03 21:00:41.333: W/System.err(20943):         at java.net.MulticastSocket.checkJoinOrLeave(MulticastSocket.java:233)
04-03 21:00:41.333: W/System.err(20943):         at java.net.MulticastSocket.leaveGroup(MulticastSocket.java:183)
04-03 21:00:41.333: W/System.err(20943):         at com.example.provaclientudp.MainActivity$1.run(MainActivity.java:175)
04-03 21:00:41.333: W/System.err(20943):         at java.lang.Thread.run(Thread.java:856)


la riga del client MainActivity.java:175 è socket.leaveGroup(im);

prima mi dice che non è un socket multicast e poi mi legge lo stesso il pachetto dando poi una serie di warning
Qualcuno sa perche?
« Ultima modifica: 03 Aprile 2013, 21:06:29 CEST da lz91, Reason: Merged DoublePost »

Offline iceweasel

  • Moderatore globale
  • Utente senior
  • *****
  • Post: 878
  • Respect: +147
    • Mostra profilo
  • Dispositivo Android:
    LGE P990 - Google Nexus 5
  • Sistema operativo:
    Linux Debian Sid
Re:Socket multicast con ip broadcast
« Risposta #3 il: 04 Aprile 2013, 00:47:54 CEST »
0
Vuoi usare il multicast del protocollo IP e sbagli palesemente il gruppo multicast. Leggiti RFC 1112, quel IP non è nel range degli indirizzi validi per un gruppo multicast, l'errore riportato te lo dice chiaramente.

Comunque non mi risulta il kernel di Linux usato da Android compilato con il supporto multicast. Tutti i cellulari che ho esaminato con la ROM ufficiale non hanno il multicast abilitato.

Per scoprire se il proprio device ha il kernel con il supporto al multicast bisogna esaminare, se presente, il file "/proc/config.gz" se è attiva l'opzione CONFIG_IP_MULTICAST". Come alternativa se è presente il file "/proc/net/igmp".

Inviato dal mio LG-P990 con Tapatalk 2

adb logcat | tee /tmp/logcat | grep TAG

Offline criss74

  • Nuovo arrivato
  • *
  • Post: 25
  • Respect: +6
    • Google+
    • Mostra profilo
  • Dispositivo Android:
    Sony Xperia U - Huawei ideos
  • Play Store ID:
    Il Conte
  • Sistema operativo:
    Debian 7.0 (Testing)
Re:Socket multicast con ip broadcast
« Risposta #4 il: 04 Aprile 2013, 12:40:21 CEST »
+1
Attenzione state confondendo Multicast con Broadcast che sono due cose completamente diverse.
Prima di avventurarvi in queste cose dovreste leggervi qualcosa sui concetti fondamentali del protocollo IP.
Non vi do indicazioni specifiche perché basta una banale ricerca e vi si aprirà il mondo della conoscenza!  :-P

Offline lz91

  • Nuovo arrivato
  • *
  • Post: 37
  • Respect: +1
    • Mostra profilo
  • Dispositivo Android:
    Samsung Galaxy S I-9000
  • Sistema operativo:
    Ubuntu, Windows 7
Re:Socket multicast con ip broadcast
« Risposta #5 il: 04 Aprile 2013, 14:14:04 CEST »
0
Si hai perfettamente ragione ...
conoscevo ip broadcast e pensavo di farlo con quello,
non conoscevo l' esistenza dell' ip multicast, colpa mia. Mi si è aperto un mondo.  :-P
Grazie :)