Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
610 connectés 

  FORUM HardWare.fr
  Programmation
  Java

  Blocage des flux, réseau

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

Blocage des flux, réseau

n°755925
brasseldX
Posté le 08-06-2004 à 10:31:00  profilanswer
 

Bonjour à tous, je suis actuellement en stage dans une université étrangére. Dans le cadre de ce stage, je dois développer une application qui permet d'établir des statistiques sur le réseau interne, et d'autres....
Cependant, mon application est quasiment terminée mais je viens de m'apercevoir que lorsque un socket client envoie de trop gros paquets au serveur, il y une sorte de plantage.
Pour les flux, j'utilise InputStream et OutputStream.
J'ai déjà essayé de changer le buffer du socket en envoi et réception grâce aux méthodes socket.setSendBufferSize(int i)
                   socket.setReceiveBufferSize(int i)
Là, je ne sais plus vraiment quoi faire.
Merci d'avance pour votre précieuse aide

mood
Publicité
Posté le 08-06-2004 à 10:31:00  profilanswer
 

n°755929
nraynaud
lol
Posté le 08-06-2004 à 10:33:53  profilanswer
 

c'est quoi "une sorte de plantage" ?
 
t'as un message d'erreur à nous donner ?


---------------
trainoo.com, c'est fini
n°755938
brasseldX
Posté le 08-06-2004 à 10:39:50  profilanswer
 

non, il ne me génére aucune exception, aucune erreur

n°755941
brasseldX
Posté le 08-06-2004 à 10:41:41  profilanswer
 

en fait j'envoie des vecteur de byte, qui vont en général d'une taille 1 jusqu'à 2000000. Sur la machine locale ça marche bien mais que quand je fais de l'affichage sur la console. En fait, je fais des SoP de temps à autres et je m'aperçois qu(il n'y a plus de données qui est envoyée.

n°755943
nraynaud
lol
Posté le 08-06-2004 à 10:43:23  profilanswer
 

c'est hard, là, je vois pas trop, il faudrait surveiller au niveau de l'OS.


---------------
trainoo.com, c'est fini
n°755948
brasseldX
Posté le 08-06-2004 à 10:48:17  profilanswer
 

et le probléme ne vient pas de Java puisque j'ai exactement le même en C. Et je ne pense pas qu'il est nécessaire de surveiller au nivea de l'OS. Toute maniére, je n'ai pas le niveau pour faire ça (DUT info Lille). Et de plus mon tuteur ne m'aurai pas pompé ce sujet. Et ce ...., il n'a pas de solution non plus !!

n°755969
nraynaud
lol
Posté le 08-06-2004 à 10:58:11  profilanswer
 

c'est sûr que si tu envoies un gros machin, forcément, c'est lent, mais il peut y avoir des stratégies pour masquer un peu la chose ou tu peux être victime d'un effet pervers (un truc à classer avec l'asphyxie de la bande montante sur les gros téléchargement en ADSL).


---------------
trainoo.com, c'est fini
n°755972
brasseldX
Posté le 08-06-2004 à 10:59:13  profilanswer
 

Connaissez vous un autre moyen, plutot que le inputStream et le OutputStream, pour envoyer des paquets d'une certaine taille. Mais il faut que les flux n'influent pas sur le calcul de la bande passante car au début j'envoyais et recevais des chaînes de caractéres mais c'est beaucoup trop long. Surtout lors de comparaisons avec un programme en C.

n°755974
brasseldX
Posté le 08-06-2004 à 11:00:35  profilanswer
 

oui je sais que ça doit être lent, c'est logique. Mais là, il n'y a plus rien qui est envoyé ni reçu. Alors ce n'est pas le probléme.

n°755975
brasseldX
Posté le 08-06-2004 à 11:02:39  profilanswer
 

Ah oui, j'ai aussi essayé l'expérience entre deux PC via un cable croisé et j'ai toujours le même probléme. Pourtant sur une machine locale (serveur + client), il n'y a pas de problémes (enfin, de temps à autres, car ça lui arrive aussi de bloquer). Le pire, c'est que quand je fais de l'affichage sur la console de ce que je reçois et j'envoi, et bien ça marche nickel !! Mais bon forcément, ça fausse complétement mes données.

mood
Publicité
Posté le 08-06-2004 à 11:02:39  profilanswer
 

n°755978
nraynaud
lol
Posté le 08-06-2004 à 11:04:30  profilanswer
 

on peut voir le code d'envoi et de réception ? j'ai comme un doute d'un coup ...


---------------
trainoo.com, c'est fini
n°755985
brasseldX
Posté le 08-06-2004 à 11:08:19  profilanswer
 

bon attend parceque c'est assez long quand même, et surtout, il n'est vraiment pas optimisé, je sais qu'il y a pas mal de modif a faire dessus !! Surtout pour l'allocation mémoire ;-)

n°755987
brasseldX
Posté le 08-06-2004 à 11:10:24  profilanswer
 

Code :
  1. while((size = comModel.getNextSize()) != -1)
  2.   {
  3.  //   System.out.println("\nSize "+size);
  4.    vecChar = new byte[size];
  5.    int nbMessage = 0;
  6.    start = System.currentTimeMillis();
  7.    while((iteration = comModel.getNextIteration()) != 0)
  8.    {
  9. //      System.out.println("\nIteration "+iteration);
  10.     nbMessage++;
  11.     long send = System.currentTimeMillis()-chrno;
  12.     if(logFile != null)
  13.     {
  14.      logFile.write("" );
  15.      logFile.write("Message sent at "+send);
  16.     }
  17. //    System.out.println("\nle client va envoyer "+vecChar.length);
  18.     out.write(vecChar);
  19. //    System.out.println("\nle client envoie "+size);
  20.     int nLeft = size ;
  21.     while(nLeft > 0)
  22.     {
  23. //  System.out.println("\tle client qttend " );
  24.      int nRead = in.read(vecChar);
  25. //     System.out.println("\tle client recoi "+nRead);
  26.      nLeft -= nRead;
  27.     }
  28. //    System.out.println(" le client a reçu "+size);
  29.     if(logFile != null)
  30.     {
  31.      send = System.currentTimeMillis()-chrno;
  32.      logFile.write("\tMessage received at " + send);
  33.     }
  34.     out.flush();
  35.    }
  36.    comModel.resetIteration();
  37.    long end = System.currentTimeMillis();
  38.    resultCli.addValues((double)size, ((double)(end-start))/(2.0 * nbMessage));
  39.   }

n°755992
brasseldX
Posté le 08-06-2004 à 11:12:20  profilanswer
 

le précédent c'était pour le client, voici le serveur

Code :
  1. byte []data = new byte [sock.getReceiveBufferSize()];
  2.   sock.setSendBufferSize(5000000);
  3. //  System.out.println(sock.getSendBufferSize() + "Send buffer clien" );
  4.   sock.setReceiveBufferSize(5000000);
  5. //  System.out.println(sock.getReceiveBufferSize() + "Receive buffer clien" );
  6.   while(true)
  7.   {
  8. //       while(in.available() <= 0);
  9. //    data = new byte [in.available()];
  10. //   System.out.println("serveur recoi " );
  11.    int nRead = in.read(data);
  12.    if(nRead==-1)
  13.     break;
  14. //   System.out.println("a recu "+nRead);
  15.       long send = System.currentTimeMillis() - chrno;
  16.    if(logFile != null)
  17.    {
  18.     logFile.write("" );
  19.     logFile.write("Message received at "+send);
  20.    }
  21. //   System.out.println("serveur envoie-> "+data.length);
  22.    out.write(data);
  23.    if(logFile != null)
  24.    {
  25.     send = System.currentTimeMillis() - chrno;
  26.     logFile.write("\tMessage resent at " + send);
  27.    }
  28.    out.flush();
  29.   }


Voilà mis a part pas mal de chose à changer au niveau de l'implé, je ne vois pas ou et le probléme !! Surtout qu'à certain moment, tout fonctionne correctement.

n°756018
nraynaud
lol
Posté le 08-06-2004 à 11:20:25  profilanswer
 

dans le premier, il est affecté où size ?
dans le second, c'est quoi sock.getReceiveBufferSize() ?


---------------
trainoo.com, c'est fini
n°756087
brasseldX
Posté le 08-06-2004 à 11:42:17  profilanswer
 

size est affecté dans le while((size = comModel.getNextSize()), mais il n'y a aucune rreur la dedans, taille varie de 1 à x avec une progression géométrique de 2. sock.getReceiveBufferSize() retourne 8192, taille du buffer en réception par défaut.

n°756145
nraynaud
lol
Posté le 08-06-2004 à 11:57:54  profilanswer
 

ben là je vois pas, mais le code est pas hyper-clair, il peut y avoir un truc pas très visible.


---------------
trainoo.com, c'est fini
n°756160
brasseldX
Posté le 08-06-2004 à 12:02:21  profilanswer
 

bon je le remets simplifier ;-)

n°756177
brasseldX
Posté le 08-06-2004 à 12:07:51  profilanswer
 

personne n'aurai un tit exemple d'utilisation de InputStream et OutputStream qui est Propre ??

n°756262
brasseldX
Posté le 08-06-2004 à 12:39:14  profilanswer
 

Code :
  1. //Dans ce code client, il n'y a que ce qui nous interesse
  2. vecChar = new byte[comModel.getMaxSize()];
  3. while((size = comModel.getNextSize()) != -1)
  4. {
  5. while((iteration = comModel.getNextIteration()) != 0)
  6. {
  7.  out.write(vecChar, 0, size);
  8.  int nRead = in.read(vecChar);
  9.  if(nRead==-1)
  10.   break;
  11.  out.flush();
  12. }
  13. }

n°756329
brasseldX
Posté le 08-06-2004 à 13:25:15  profilanswer
 

Pour ceux que ça intéresse voici deux petit programmes bidon qui aboutissent bien sur mon probléme.

Code :
  1. import java.io.*;
  2. import java.net.*;
  3. public class Client extends Thread
  4. {
  5. public void run()
  6. {
  7.  try
  8.  {
  9.   //Changer la taille sizeMax si vous le souhaitez
  10.   int sizeMax = 1000000;
  11.   //Changer le nombre d'iteration également ;-)
  12.   int Iteration = 100;
  13.   int nbIteration = Iteration;
  14.   int portServ = 9876;
  15.   int size = 1;
  16.   Socket maSocket;
  17.   InetAddress adrServ = InetAddress.getLocalHost();
  18.   maSocket= new Socket(adrServ, portServ);
  19.   //Ici faites varier la variable plus
  20.   int plus = 1;
  21.   maSocket.setReceiveBufferSize(sizeMax * (Iteration+plus));
  22.   maSocket.setSendBufferSize(sizeMax * (Iteration+plus));
  23.   System.out.println("receive buffer --> "+maSocket.getReceiveBufferSize());
  24.   System.out.println("send buffer --> "+maSocket.getSendBufferSize());
  25.   InputStream in = maSocket.getInputStream();
  26.   OutputStream out = maSocket.getOutputStream();
  27.   while((size *= 2) < sizeMax)
  28.   {
  29.    byte []vecChar = new byte[size];
  30.    while(nbIteration-- != 0)
  31.    {
  32.     out.write(vecChar);
  33.     System.out.println("le client envoie "+vecChar.length);
  34.     System.out.println("\tle client attend " );
  35.     int nRead = in.read(vecChar);
  36.     System.out.println("\tle client recoi "+nRead);
  37.     if(nRead==-1)
  38.      break;
  39.   /*  int nLeft = size ;
  40.     while(nLeft > 0)
  41.     {
  42.      System.out.println("\tle client attend " );
  43.      int nRead = in.read(vecChar);
  44.      System.out.println("\tle client recoi "+nRead);
  45.      nLeft -= nRead;
  46.     }*/
  47.     System.out.println((Iteration-nbIteration)+" le client a recu "+size);
  48.     out.flush();
  49.    }
  50.    nbIteration = Iteration;
  51.   }
  52.   System.out.println("les donnees ont bien ete envoyees" );
  53.  }
  54.  catch(UnknownHostException uhe)
  55.  {
  56.   System.out.println("machine inconnue "+uhe);
  57.     }
  58.  catch(IOException ioe)
  59.  {
  60.   System.out.println("erreur d'entree sortie "+ioe);
  61.     }
  62.  catch(NullPointerException npe)
  63.  {
  64.   System.out.println("Fin du service " );
  65.     }
  66. }
  67. public static void main(String [] args)
  68. {
  69.  Serveur serveur = new Serveur();
  70.  serveur.connect();
  71.  serveur.start();
  72.  Client client = new Client();
  73.  client.start();
  74. }
  75. }
  76. import java.io.*;
  77. import java.net.*;
  78. public class Serveur extends Thread
  79. {
  80. protected ServerSocket s;
  81. public void connect()
  82. {
  83.     int numPort=9876;
  84.     try
  85.     {
  86.      s = new ServerSocket(numPort);
  87.      System.out.println("serveur en ecoute sur le port "+numPort);
  88.  }
  89.  catch(IOException i)
  90.     {
  91.   System.err.println("probleme d'execution" + i);
  92.     }
  93. }
  94. public void run()
  95. {
  96.  while(true)
  97.   try
  98.   {
  99.       executer(s.accept());
  100.      }
  101.      catch(IOException ioe)
  102.      {
  103.       System.out.println("ioe --> "+ioe);
  104.      }
  105. }
  106. static void executer(Socket sock) throws IOException
  107.     {
  108.  InputStream in = sock.getInputStream();
  109.  OutputStream out = sock.getOutputStream();
  110.  byte []data = new byte [sock.getReceiveBufferSize()];
  111.  while(true)
  112.  {
  113.   int nRead = in.read(data);
  114.   if(nRead==-1)
  115.    break;
  116.   out.write(data);
  117.   out.flush();
  118.  }
  119. }
  120. }


Voilà amusez vous bien avec ça, j'espére que vous pourrez trouver mon p'tit probléme, ça serait vraiment cool ;-)

n°756843
brasseldX
Posté le 08-06-2004 à 16:50:43  profilanswer
 

uplaaaaaaaaaaaaaaa

mood
Publicité
Posté le   profilanswer
 


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  Java

  Blocage des flux, réseau

 

Sujets relatifs
[bash/shell] Flux d'entréeArrêter le service réseau ?
Faire communiquer 2 SGBD +rendre la liaison robuste à la panne réseauscanner le reseau en php
Commande pour voir si u PC du réseau est alluméscanner un reseau en php c'est faisable
Monitorer un réseau local en javaenvoit fichier reseau
Protocole réseau en C++Python sous windows : meilleur moyen pour connecter un lecteur reseau?
Plus de sujets relatifs à : Blocage des flux, réseau


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR