Problème de sockets

Problème de sockets - Java - Programmation

Marsh Posté le 29-04-2004 à 11:05:25    

Bonjour,
 
j'ai développé un serveur en C++ qui reçoit des requêtes en Java.
Le serveur tourne sous Linux, et Java on s'en fout un peu :)
 
le problème est que quand je fais tourner le client sous Windows, tout se passe bien :à la fin de chaque requête, les sockets sont bien fermées, mais quand je fais tourner le client sous UNIX/Linux, rien ne va plus : toutes les sockets passent en TIME_WAIT et au bout de 5 requêtes, le serveur plante (Broken Pipe).
 
je pense que ça vient d'une interprétation différente du code Java en fonction de la plateforme. Vous avez une idée ? parce que là je ne sais plus trop quoi faire...
 
Merci

Reply

Marsh Posté le 29-04-2004 à 11:05:25   

Reply

Marsh Posté le 29-04-2004 à 11:17:18    

euuh....qu'est-ce que tu veux dire par "qui reçoit des reqûetes en Java"???

Reply

Marsh Posté le 29-04-2004 à 11:24:33    

le client est en java, c'est tout ce que ça veut dire [:spamafote]  
ce qui est envoyé, c'est du bête texte...

Reply

Marsh Posté le 29-04-2004 à 15:25:42    

en passant le serveur en Java, y'a toujours le problème :o  
 
voilà le code succint du serveur :
 

Code :
  1. ServerSocket serverSocket = null;
  2. try {
  3. serverSocket = new ServerSocket();
  4. serverSocket.setReuseAddress(true);
  5. serverSocket.bind(new InetSocketAddress(port));
  6. } catch (IOException e) {
  7. System.err.println("Could not listen on port: " + port);
  8. System.exit(1);
  9. }
  10. while (true) {
  11. Socket clientSocket = null;
  12. try {
  13.  System.out.println("Listening..." );
  14.  clientSocket = serverSocket.accept();
  15.  PrintWriter out = new PrintWriter(clientSocket.getOutputStream(), true);
  16.  BufferedReader in = new BufferedReader(new  InputStreamReader(clientSocket.getInputStream()));
  17.  //int nbChar = Integer.parseInt(in.readLine());
  18.  System.out.println("Réception d'une requête" );
  19.  String requete = in.readLine();
  20.  System.out.println(">>> " + requete);
  21.  /*
  22.  Traitement de la requête
  23.  */
  24.  out.write(resultat + "\n" );
  25.  out.flush();
  26.  System.out.println("Déconnexion en cours..." );
  27.  out.close();
  28.  in.close();
  29.  clientSocket.close();
  30.  System.out.println("Déconnecté" );
  31.  current = (current + 1) % nbMax;
  32. } catch (IOException e) {
  33.  System.err.println("Accept failed." );
  34.  System.exit(1);
  35. }
  36. }


 
et voilà le code du client  
 

Code :
  1. Socket socket = new Socket();
  2. socket.setReuseAddress(true);
  3. socket.connect(new InetSocketAddress(dhost, dport));
  4. System.out.println("Connecté" );
  5. System.out.println("Récupération du tunnel de communication" );
  6. BufferedReader in = new BufferedReader(new InputStreamReader(routeur.getInputStream()));
  7. BufferedWriter out = new BufferedWriter(new OutputStreamWriter(routeur.getOutputStream()));
  8. System.out.println("Tunnel OK" );
  9. System.out.println("Envoi de la requête" );
  10. out.write(requete.length() + " " + requete + "\n" );
  11. out.flush();
  12. System.out.println("Réception de la réponse" );
  13. resultat = Integer.parseInt(in.readLine());
  14. System.out.println("Réponse OK" );
  15. System.out.println("Déconnexion..." );
  16. in.close();
  17. out.close();
  18. routeur.close();
  19. System.out.println("Déconnecté" );


 
voilà, c'est quasiment le code qu'on trouve sur le tutorial de SUN, ça marche nickel quand le client tourne sous windows, mais quand le client tourne sous Linux, ça marche pas... toutes les connexions passent en TIME_WAIT, et quand on atteinte le maximum du système, y'a crash du serveur...

Reply

Marsh Posté le 29-04-2004 à 16:46:38    

c'est bon les gars laissez tomber, les petits pères du forum SUN ne se touche pas le nombril en se la jouant devant les n00bs :o

Reply

Marsh Posté le 29-04-2004 à 17:09:39    

Predicator a écrit :

c'est bon les gars laissez tomber, les petits pères du forum SUN ne se touche pas le nombril en se la jouant devant les n00bs :o


 
Sodo-gravier-ban
 [:b-s]

Reply

Marsh Posté le 29-04-2004 à 17:15:02    

n'empêche c'est marrant de voir que quand c'est une question technique y'a personne, mais pour sortir des trolls, là ça y va :o

Reply

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

Predicator a écrit :

n'empêche c'est marrant de voir que quand c'est une question technique y'a personne, mais pour sortir des trolls, là ça y va :o


Ce genre de remarques, t'es sympa, tu t'en passes ...
 
Et je remarque que tu n'expliques pas la solution ... Sympa pour les autres qui auront le même problème plus tard ...

Reply

Marsh Posté le 30-04-2004 à 10:19:20    

le TIME_WAIT fait partie du protocole TCP/IP, et on ne peut pas s'en débarrasser. si on tombe sur un tel problème, il faut revoir son design, car il n'y a pas d'autre solution. le fait que ça marche sous Windows est parce qu'il y a un bug d'implémentation des sockets dans la JVM de SUN pour Windows...

Reply

Marsh Posté le 30-04-2004 à 13:41:53    

\n -> \r\n

Reply

Sujets relatifs:

Leave a Replay

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