Multicast

cs_felouss Messages postés 6 Date d'inscription dimanche 16 avril 2006 Statut Membre Dernière intervention 26 juin 2006 - 26 juin 2006 à 01:24
cs_Yenapa Messages postés 67 Date d'inscription samedi 12 juillet 2003 Statut Membre Dernière intervention 26 juin 2009 - 30 juin 2006 à 01:42
bounjour,je vous pose mon pblm,je dois envoyer un paquet d'une taille (>65kilo)en UDP,comme vous le savez UDP permet l envoie d'un paquet (grace a datagrampacket)de 65kilo,au nivo dus serveur  je divise le fichier en le mettant dans un tableau de string et je met ce tableau comme parametre dans datagrampacket,jusk ici pas de pblm,le pblm commence du coté client,je fais une boucle pour recevoir tt les paquet mais le probleme c que sauf le 1er paquet arrive apres ca se block!!!!si klk1 peut m aider!!c un peu urgent!!merci

6 réponses

scaryman Messages postés 492 Date d'inscription vendredi 30 janvier 2004 Statut Membre Dernière intervention 16 mai 2007 12
26 juin 2006 à 08:33
Salut
Que veux-tu qu'on te dises si tu ne nous donnes pas ton code ? On ne peut rien faire là.

A++
0
cs_felouss Messages postés 6 Date d'inscription dimanche 16 avril 2006 Statut Membre Dernière intervention 26 juin 2006
26 juin 2006 à 10:36
le 1er code celui du serveur
/////////
import java.awt.*;
import javax.swing.*;
import java.awt.event.*;
import java.util.*;
import java.io.*;
import java.net.*;

class MulticastServer
{
   
public static void main(String arg[])
{
                        JFileChooser chooser = new JFileChooser();
                        chooser.setAcceptAllFileFilterUsed(false);
                       // chooser.addChoosableFileFilter(FILE_FILTER);
                        int ret = chooser.showOpenDialog(null);
                        if (ret == JFileChooser.APPROVE_OPTION) {//selection valide
                                                                

            if (chooser.getSelectedFile()== null ) return; // user pressed Cancel
            File theFile = new File(chooser.getCurrentDirectory(),
                                                chooser.getName(chooser.getSelectedFile()) );
          theText = "";
            try {
                FileReader fr = new FileReader(theFile);
                char charar[] = new char[(int)theFile.length()];
                fr.read(charar);
                theText = String.valueOf(charar);
                String ligne; System.out.println("zzz");
                BufferedReader entree = new BufferedReader(fr);
                do{ ligne=entree.readLine(); System.out.println("kkk");
                if(ligne!=null)
                 System.out.println("ligne"); System.out.println(ligne);}
                while (ligne!=null);
                entree.close();      
                fr.close();
                }
            catch ( FileNotFoundException excpt0 ) {}
            catch ( IOException excpt1 ) {}
           
            //currDirectory=(String)chooser.getCurrentDirectory();
        /*    currFileName=chooser.getName(chooser.getSelectedFile());           
            statusBar.setText(currFileName+ "   ...ouvert");
            zone.setText("");
            String contenu=String.valueOf(theText);
            Write_text(contenu,0);   
            dirty=false;updateCaption();}*/
}
//System.out.println(theText);
    try{
        size=theText.length();
    System.out.println("the size is : "+size);    //System.out.println(theText);
       // c3=size/65000;
     // System.out.println(c3);
       int c3=size/65000;//System.out.println(c3);
       int c4=c3+1;System.out.println("Decoupage en : "+c4);
       int c5=c3*65000;//System.out.println("le chifre est :"+c5);
        String [] tab = new String [10000000];
        //for(int i=0;i<tab.length;i++)
      int i=0;
      int k=0;
       while(i<c4)
        { 
            String aa[]= new String[3000];
           
            int f = k + 65000 ;
            System.out.println("size of f: "+f);
           
            if (f>size)
            {
                f=size-k;
                System.out.println("size of f smaller: "+f);
                int help = size;
                tab[i]= theText.substring(k,help);
            }//System.out.println(tab.length);
               //System.out.println(theText);
            //c3=size/65000;
             //System.out.println(c3);
             else {
                 tab[i]= theText.substring(k,f);
             }
            ;//System.out.println(tab[i]);
             k=k+65000;
              //i++;  }while(i<c4);
       
             //for(int l=0;l<tab.length;l++){
            //System.out.println(tab[l]);
            //}
       
             buff = new byte[200];
            String s="Message a envoyer";
            //byte data[] = s.getBytes();
               // for(int j=0;j<tab.length;j++){
             data = tab[i].getBytes(); i++;
             System.out.println("size of i: "+i);
            Ip = InetAddress.getByName("224.0.1.20");
       
              p = new DatagramPacket(data,data.length,Ip,8082);
               serv = new MulticastSocket();
             c = new MulticastSocket(8082);
              rec = new DatagramPacket(buff,buff.length);
               // System.out.println(theText);
       
            serv.joinGroup(Ip);
            c.joinGroup(Ip);
            serv.send(p);
            //
            //while(true){
            c.receive(rec);       
       
       
       
        String re = new String(rec.getData());
        System.out.println(re);
        //} 
       
        }   //while(i<=c4);
       
        //System.out.println(theText);
       // serv.close();
       }
       catch(IOException e){System.out.println(e);}
}
public static String theText;
//public static JFileChooser chooser = new JFileChooser();
//public static File theFile = new File(chooser.getCurrentDirectory(),chooser.getName(chooser.getSelectedFile()) );
public static int size;
//public static int c4=size;
    //public static int  c3=c4/65000;
   
    //public static String [] tab = new String [c3];
public static byte data[];
public static byte buff[];

public static InetAddress Ip; // InetAddress.getByName("224.0.1.20");
       
      public static  DatagramPacket p; //= new DatagramPacket(data,data.length,Ip,8082);
     public static   MulticastSocket serv;// = new MulticastSocket();
  public static      MulticastSocket c;// = new MulticastSocket(8082);
  public static      DatagramPacket rec;// = new DatagramPacket(buff,buff.length);
}
////////////////////////////
voici le code du client
////////

import java.awt.*;
import javax.swing.*;
import java.awt.event.*;
import java.util.*;
import java.io.*;
import java.net.*;

class MulticastClient
{

public static void main(String arg[])
{
    try{
        
         String a = "ameur ";
        String a1 = "tu est trop fort ";
        a=a.concat(a1);
         System.out.println(a);
        
        
      // Object o;
       //File objFich = new File ("amr.txt");
       //DataOutputStream sortie = new  DataOutputStream(new FileOutputStream(objFich));
       //o=objFich;

               
int i=0;
while(i<10)
       { String mess = "fred t es trop B... ";
        byte buff[] = mess.getBytes();
        String host = "224.0.1.20";
        byte data[] = new byte[200];
         Ip = InetAddress.getByName("224.0.1.20");
       
         p = new DatagramPacket(data,data.length);
         rec = new DatagramPacket(buff,buff.length,Ip,8082);
         serv = new MulticastSocket(8082);
       
        serv.joinGroup(InetAddress.getByName(host));
        serv.receive(p);
       
        String s = new String(p.getData());
        mm=mm.concat(s);
        System.out.println(mm);i++;
      
       //}

        try{
 File file = new File("a.txt");
 FileWriter out = new FileWriter(file,true);
 //int i=sortie.lastIndexOf('%');
 //if(k==0)if(i!=-1)sortie=sortie.substring(0,i);
 out.write(mm);
 out.close();
 }catch (IOException e) {}
        serv.send(rec);
        serv.close();
       
         }
       
       }
       catch(IOException e){System.out.println(e);}
}

 public static String mm = "";
public static byte data[];
public static byte buff[];

public static InetAddress Ip; // InetAddress.getByName("224.0.1.20");
       
      public static  DatagramPacket p; //= new DatagramPacket(data,data.length,Ip,8082);
     public static   MulticastSocket serv;// = new MulticastSocket();
  public static      MulticastSocket c;// = new MulticastSocket(8082);
  public static      DatagramPacket rec;

}
///////
merci encore!!     
      
       
 
0
super_toinou Messages postés 764 Date d'inscription mardi 25 mai 2004 Statut Membre Dernière intervention 8 mars 2011 6
26 juin 2006 à 17:51
un peu long le code pour tt lire, c etai juste pour dire,
fais gaffe quand t envoie un packet en datagramme, l ordre d arrivée des paquets est pas garantie résultat tu peux te retrouver avec la fin de ton fichier au début !!
0
cs_felouss Messages postés 6 Date d'inscription dimanche 16 avril 2006 Statut Membre Dernière intervention 26 juin 2006
26 juin 2006 à 18:21
merci pour le conseil et dsl pour la longueur du code,mais de ce coté pour l instant ca va vu q'un seul paquet arrive !!!c plutot les autres paquet qui ne n arrivent pas!
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
cs_Yenapa Messages postés 67 Date d'inscription samedi 12 juillet 2003 Statut Membre Dernière intervention 26 juin 2009
30 juin 2006 à 01:38
Cette partie du client me semble bizarre...

while(i<10)
       { String mess = "fred t es trop B... ";
        byte buff[] = mess.getBytes();
        String host = "224.0.1.20";
        byte data[] = new byte[200];
         Ip = InetAddress.getByName("224.0.1.20");
       
         p = new DatagramPacket(data,data.length);
         rec = new DatagramPacket(buff,buff.length,Ip,8082);
         serv = new MulticastSocket(8082);
       
        serv.joinGroup(InetAddress.getByName(host));
        serv.receive(p);
       
        String s = new String(p.getData());
        mm=mm.concat(s);
        System.out.println(mm);i++;
      
       //}

Essaie de la remplacer par ca:

byte buff[] = mess.getBytes();
String host = "224.0.1.20";
byte data[] = new byte[200];
Ip = InetAddress.getByName("224.0.1.20");
       
p = new DatagramPacket(data,data.length);
rec = new DatagramPacket(buff,buff.length,Ip,8082);
serv = new MulticastSocket(8082);
       
serv.joinGroup(InetAddress.getByName(host));
while(i<10) {
        serv.receive(p);
        mm=mm.concat(new String(p.getData()));
        System.out.println("Etape " + i + mm);
        i++;
      
       //}

Autre conseil, numerote tes paquets
garde toi par exemple 4 octets (un int) au debut de ton datagramme pour stocker son numero dans la chaine, et limite toi a 4ko/datagramme, tu aura moins de paquets perdus (a mon avis).
Il faut savoir qu'un routeur peut decider de detruire un paquet (du moins ne pas le relayer) si il est trop occupé. Dans le cas du protocole TCP, le client s'en appercoit grace aux numeros de sequence et donc n'emet pas d'accusé de reception vers le serveur, qui renvoie ce paquet au bout d'un certain temps. En UDP, que dalle. Paquet perdu, a toi de gerer la reemission.
Donc si tu numerote tes paquets, tu peux savoir dans quel ordre les mettre, et t'assurer de tous les avoir recu (en envoyant un datagramme d'initialisation au debut precisant toutes les infos a connaitre comme le nombre de paquets, la taille utile de chaque paquet, le nom du fichier, ...).
Si il t'en manque un, tu peux toujour le redemander a ton serveur (qui devra etre en mesure de le retrouver dans le fichier.. y a pas une methode seek dans BufferedInputStream?... la flemme d'aller voir)
en supposant que le paquet d'initialisation ai comme numero -2147483648 (le plus petit entier),
ca te laisse 2^32-1=4294967295 paquets possible
a 4ko/paquet, ca te fait une possibilite de transmission d'un peu moins de 16 teraoctets... c'est large
Pour simplifier tu peut te limiter juste aux entiers positifs
(-1: paquet d'initialisation, 0 à 2^32-1: paquets de donnée), ce qui fait en gros du 8 tera... encore large..
A toi de voir, et amuse toi bien

D'autre part, ne t'attend pas a ce que ce code marche sur le net, car les adresses de classe D sont bloquées par la plupart des routeurs selon mon prof de reseau.  En ipv6, y a moyen, mais je suis pas sur que tu puisses l'utiliser par le net.
si tu n'envoie qu'a un seul client, utilise udp sur les adresses ip standard, voire meme tcp, qui simplifie tout ce que je decrit plus haut)

[mode chieur]
je trouve ta facon de programme assez moche (dsl  j'ai pas pu m'empecher)...
D'une maniere generale, evite les attributs static, ca tue l'interet de la prog objet..
chieur

Enfin ca serais cool que tu me tienne au courant, si ca marche par le net ca m'interesse grave, pour continuer mon projet de transfert vers plusieurs personnes (qui a dit P2P? plus legal a partir de.. ben aujourd'hui tiens.. [mode rageux]DADVSI DE MES COUILLESrageux) en economisant la bande passante (multicast powaa) 

Bon dsl si mon orthograffe est douteuse et mes phrases chaotiques, il est 1h38, et je vais me coucher......
0
cs_Yenapa Messages postés 67 Date d'inscription samedi 12 juillet 2003 Statut Membre Dernière intervention 26 juin 2009
30 juin 2006 à 01:42
ha oui j'oubliais...
Bon courage ^^ et a+

Et si je me suis gouré dans mes explications, dites le moi, ca m'evitera de passer pour un con la prochaine fois ^^
0
Rejoignez-nous