Socket: Mesure d'upload et dowload [RESOLU]

Socket: Mesure d'upload et dowload [RESOLU] - Java - Programmation

Marsh Posté le 01-09-2005 à 06:36:16    

Salut a tous,
 
J'ai un probleme avec une mesure de vitesse d'upload et dowload. Je voulais tester les performances des sockets java, et j'ai ecris un petit programme....qui me donne des resultats evidemment erronés.
 
Un client interroge un serveur de newsGroup, envoye des requetes pour des articles a la chaine: je mesure la vitesse d'envoi des requetes. Un thread ecoute sur le meme socket ce qui arrive: je mesure la quantite d'info recu.
 
Voici ce que j'ai a l'ecran..
 

Code :
  1. Downloading at :162 ko/s.
  2. Uploading at :30 ko/s.
  3. Downloading at :160 ko/s.
  4. Uploading at :20 ko/s.
  5. Downloading at :164 ko/s.
  6. Uploading at :12 ko/s.
  7. Downloading at :180 ko/s.
  8. Uploading at :20 ko/s.
  9. Downloading at :225 ko/s.
  10. Uploading at :19 ko/s.


 
Formidable, mais ma connection est la suivante:  3.0 Mbps download and 384 Kbps upload. ( Rogers express Canada) et je devrais avoir au max dowload=375 ko/s et 48 ko/s en upload.
 
Voici mes algo:
 
Upload:

Code :
  1. String toSend = "NEXT\n";
  2. int totaltSentBytes = 0;  // Total de byte envoye depuis la derniere mesure.
  3. int bytesSent = toSend.getBytes().length ; // Octets seront envoyes a chaque iteration   
  4. long t0 = System.currentTimeMillis(); // On initialise t0 a "maintenant"
  5. // Grosso modo, il y a 700 000 messages a rapatrier (c'est un newsGroup )
  6. for (int cursor = this.olderMessageId ; cursor <= this.latestMessageID ; cursor++)
  7. {
  8. this.conn.getOut().write(toSend); // Ecriture dans le socket avec un PrintWriter
  9. totaltSentBytes += bytesSent;     // "Mise a jour du compteur"
  10. if ((System.currentTimeMillis() - t0) > 5000) //mesure toutes les 5 secondes
  11. {
  12.  System.out.println("Uploading at :"+totaltSentBytes/1024/((System.currentTimeMillis() - t0)/1000)+" ko/s." );
  13.  totaltSentBytes = 0;
  14.  t0 = System.currentTimeMillis();
  15. }
  16. }


 
Download:

Code :
  1. int bytesRead = 0;
  2. long t0 = System.currentTimeMillis();
  3. while (true){
  4.  in.read();
  5.  bytesRead += 8;
  6.  if ((System.currentTimeMillis() - t0) >5000)
  7.  {
  8.   System.out.println("Downloading at :"+bytesRead/1024/((System.currentTimeMillis() - t0)/1000)+" ko/s." );
  9.   bytesRead = 0;
  10.   t0 = System.currentTimeMillis();
  11.  }
  12. }


 
Comment se fait-il que j'upload et download quasiement a 50% de ce que mon provider permet ?
(Je precise que si j'utilise un client commercial genre Newsbin, l'upload et le download se font aux limites de mon FAI).
 
Je ne dispose pas de plusieurs ordinateurs, certains ont-ils fait ce genre de test sur un LAN ?
Ou alors il y a quelques chose que j'ai mal compris ?
 
PS: Je n'utilise pas d'anti-virus et ma machine tourne sous XP Pro....


Message édité par bartleby le 06-09-2005 à 18:00:09
Reply

Marsh Posté le 01-09-2005 à 06:36:16   

Reply

Marsh Posté le 01-09-2005 à 10:11:19    

Les taux de transfert dépendent ( en partie ) de la machine à laquelle tu te connectes à distance ( serveur ), essaie sur un autre serveur et donne nous tes résultats.
En effet si la machine distante est sollicitée par un million de clients, la connexion de cette machine sera divisée par un million ( en gros ) et donc de ton côté ( client ) tu auras des résultats plus que médiocres.
Cela m'intérresse également, mais j'avoue que je ne m'y suis jamais réellement mis sérieuseument.
 

Reply

Marsh Posté le 01-09-2005 à 16:39:52    

Non, ce n'est pas le probleme.
 
Si je teste juste apres avec NewsBin, les debits sont bien ceux attendus.
 
Le probleme vient:
 
- Soit de ma facon d'envoyer les donnees.
- Soit de ma facon de mesure la vitesse.

Reply

Marsh Posté le 06-09-2005 à 09:14:29    

tente en C ^^

Reply

Marsh Posté le 06-09-2005 à 09:31:27    

bien pour les unités ! Vive le SI
1 ko = 1000o
1 kio = 1024o
 
 
 
 
# this.conn.getOut().write(toSend); // Ecriture dans le socket avec un PrintWriter
#     totaltSentBytes += bytesSent;    // "Mise a jour du compteur"
 
 
t'as sans doute moyen de faire tout ça en async

Reply

Marsh Posté le 06-09-2005 à 18:03:17    

Bon, le probleme est resolu:
 
Il est beaucoup plus rapide de lire lorsqu'on le fait dans un buffer. Donc on peut remplacer la ligne suivante:
 
in.read();
 
par
 
byte[] buffer = new byte[5040];
in.read(buffer);  
 
En procedant de la sorte, je download a 300 ko/s sans probleme.
 
Utiliser la command XOVER  au lieu de NEXT pour rapatrier les articles a pas mal aide aussi D: !


Message édité par bartleby le 06-09-2005 à 18:04:06
Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed