Blocage des flux, réseau

Blocage des flux, réseau - Java - Programmation

Marsh Posté le 08-06-2004 à 10:31:00    

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

Reply

Marsh Posté le 08-06-2004 à 10:31:00   

Reply

Marsh Posté le 08-06-2004 à 10:33:53    

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


---------------
trainoo.com, c'est fini
Reply

Marsh Posté le 08-06-2004 à 10:39:50    

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

Reply

Marsh Posté le 08-06-2004 à 10:41:41    

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.

Reply

Marsh Posté le 08-06-2004 à 10:43:23    

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


---------------
trainoo.com, c'est fini
Reply

Marsh Posté le 08-06-2004 à 10:48:17    

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 !!

Reply

Marsh Posté le 08-06-2004 à 10:58:11    

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
Reply

Marsh Posté le 08-06-2004 à 10:59:13    

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.

Reply

Marsh Posté le 08-06-2004 à 11:00:35    

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.

Reply

Marsh Posté le 08-06-2004 à 11:02:39    

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.

Reply

Marsh Posté le 08-06-2004 à 11:02:39   

Reply

Marsh Posté le 08-06-2004 à 11:04:30    

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


---------------
trainoo.com, c'est fini
Reply

Marsh Posté le 08-06-2004 à 11:08:19    

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 ;-)

Reply

Marsh Posté le 08-06-2004 à 11:10:24    

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.   }

Reply

Marsh Posté le 08-06-2004 à 11:12:20    

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.

Reply

Marsh Posté le 08-06-2004 à 11:20:25    

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


---------------
trainoo.com, c'est fini
Reply

Marsh Posté le 08-06-2004 à 11:42:17    

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.

Reply

Marsh Posté le 08-06-2004 à 11:57:54    

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
Reply

Marsh Posté le 08-06-2004 à 12:02:21    

bon je le remets simplifier ;-)

Reply

Marsh Posté le 08-06-2004 à 12:07:51    

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

Reply

Marsh Posté le 08-06-2004 à 12:39:14    

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. }

Reply

Marsh Posté le 08-06-2004 à 13:25:15    

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 ;-)

Reply

Marsh Posté le 08-06-2004 à 16:50:43    

uplaaaaaaaaaaaaaaa

Reply

Marsh Posté le    

Reply

Sujets relatifs:

Leave a Replay

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