cs_felouss
Messages postés6Date d'inscriptiondimanche 16 avril 2006StatutMembreDernière intervention26 juin 2006
-
26 juin 2006 à 01:24
cs_Yenapa
Messages postés67Date d'inscriptionsamedi 12 juillet 2003StatutMembreDernière intervention26 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
cs_felouss
Messages postés6Date d'inscriptiondimanche 16 avril 2006StatutMembreDernière intervention26 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);
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);
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
////////
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;
super_toinou
Messages postés764Date d'inscriptionmardi 25 mai 2004StatutMembreDernière intervention 8 mars 20116 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 !!
cs_felouss
Messages postés6Date d'inscriptiondimanche 16 avril 2006StatutMembreDernière intervention26 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!
Vous n’avez pas trouvé la réponse que vous recherchez ?
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......