[java]Régler le timeout de déconnexion des sockets

Régler le timeout de déconnexion des sockets [java] - Java - Programmation

Marsh Posté le 30-03-2004 à 22:02:31    

Je dispose d'une appli client/serveur en java, qui utilise les sockets pr les connexions. Jusque là tt va bien, la communication se fait bien.
Par contre en cas de déconnexion du client, par exemple si on enlève le cable réseau, le serveur met plus de 10 minutes à remarquer que le client s'est déconnecté.
Comment régler le timeout de la déconnexion, ds les options des sockets ya que le timeout de la lecture (read) qui peut être paramètrer. J'ai pensé à un mécanisme de ping-pong, ms seulement en dernier recours.
Merci d'avance.


Message édité par electricblue le 30-03-2004 à 22:02:56
Reply

Marsh Posté le 30-03-2004 à 22:02:31   

Reply

Marsh Posté le 30-03-2004 à 22:55:55    

electricblue a écrit :

Je dispose d'une appli client/serveur en java, qui utilise les sockets pr les connexions. Jusque là tt va bien, la communication se fait bien.
Par contre en cas de déconnexion du client, par exemple si on enlève le cable réseau, le serveur met plus de 10 minutes à remarquer que le client s'est déconnecté.
Comment régler le timeout de la déconnexion, ds les options des sockets ya que le timeout de la lecture (read) qui peut être paramètrer. J'ai pensé à un mécanisme de ping-pong, ms seulement en dernier recours.
Merci d'avance.

C'est TCP qui gère ça normalement.


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

Marsh Posté le 30-03-2004 à 23:08:32    

nraynaud a écrit :

C'est TCP qui gère ça normalement.


 
Donc pas possible de le faire directement depuis java??

Reply

Marsh Posté le 31-03-2004 à 00:20:50    

Reply

Marsh Posté le 31-03-2004 à 00:27:29    


ouais mais là on sait pas si la socket est encore valide ou non ...

Reply

Marsh Posté le 31-03-2004 à 00:43:18    

euh ouais je suis pas sur qu'il y ait une diff. entre ça et ce qu'il veut


---------------
Hey toi, tu veux acheter des minifigurines Lego, non ?
Reply

Marsh Posté le 31-03-2004 à 02:29:54    

setSoTimeout convient pas ds mon cas (je l'ai dit ds mon 1er post), ça met un timeout uniquement sur la réception (read). Moi je voudrais un timeout sur l'existance de la socket (erreur java.net.SocketException: Connection timed out).

Reply

Marsh Posté le 31-03-2004 à 07:52:13    

Code :
  1. boolean echangeOk; // doit être déclaré comme attribut de ta classe et pas de la methode
  2. Thread timer = new Thread() {
  3. public void run() {
  4.   try {
  5.    // ecriture socket
  6.    // lecture socket
  7.    echangeOk = true;
  8.   } catch (IOException ioe) {
  9.    // ...
  10.   }
  11. };
  12. timer.start();
  13. try {
  14. timer.join(timeOutEnSecondes *1000);
  15. } catch (InterruptedException ie) {
  16. // ...
  17. }
  18. if (echangeOk) {
  19. // la communication s'est bien passée
  20. } else { // ya eu un pb
  21. throw new MaTimeoutException("pas de réponse au bout de " + timeOutEnSecondes + "sec" );
  22. }


Message édité par LAs3R le 31-03-2004 à 07:58:44
Reply

Marsh Posté le 31-03-2004 à 09:44:11    

c'est pas tres propre mais ca doit marcher
tu pourrais améliorer en remplacant le thread par une classe qui implemente Runnable contenant le boolean echangeOk

Reply

Marsh Posté le 31-03-2004 à 16:44:15    

LAs3R a écrit :

c'est pas tres propre mais ca doit marcher
tu pourrais améliorer en remplacant le thread par une classe qui implemente Runnable contenant le boolean echangeOk


 
Merci pr ta réponse. Ms je ne pense pas qu'elle puisse marcher ds mon cas: le client peut très bien ne rien envoyer comme données tout en étant connecté.
 
Voilà une version simplifiée de mon client:

Code :
  1. public class MonClient extends Thread {
  2.   private Socket _client;
  3.   private PrintWriter _outputData;
  4.   private BufferedReader _inputData;
  5.   public MonClient(Socket client) {
  6.     super("Client" );
  7.     _client = client;
  8.     try {
  9.       _inputData = new BufferedReader(new InputStreamReader(_client.
  10.           getInputStream()));
  11.       _outputData = new PrintWriter(_client.getOutputStream());
  12.     }
  13.     catch (IOException ioe) {
  14.       /* Traitement erreur. */
  15.     }
  16.   }
  17.   public void run() {
  18.     try {
  19.       String incdata;
  20.       do {
  21.         incdata = _inputData.readLine();
  22.         /* Traitement de la requête. */
  23.       }
  24.       while (incdata.equals("FIN" ));
  25.       closeClient();
  26.     }
  27.     catch (SocketException se) {
  28.       /* Traitement erreur. */
  29.     }
  30.     catch (IOException ioe) {
  31.       /* Traitement erreur. */
  32.     }
  33.   }
  34.  
  35.   public void closeClient() {
  36.     try {
  37.       _inputData.close();
  38.       _outputData.close();
  39.       _client.close();
  40.     }
  41.     catch (IOException e) {
  42.       /* Traitement erreur. */
  43.     }
  44.   }
  45. }


Message édité par electricblue le 31-03-2004 à 16:46:50
Reply

Marsh Posté le 31-03-2004 à 16:44:15   

Reply

Marsh Posté le 31-03-2004 à 21:59:25    

perso, pour les connex tcp, je teste juste la valeur de retour de InputStream.read()
-1 => deconnexion

Reply

Sujets relatifs:

Leave a Replay

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