IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Java Discussion :

realiser un acquittement


Sujet :

Java

  1. #1
    Membre confirmé
    Inscrit en
    Septembre 2008
    Messages
    77
    Détails du profil
    Informations forums :
    Inscription : Septembre 2008
    Messages : 77
    Par défaut realiser un acquittement
    salut,
    je travaille avec les sockets TCP. Mon problème est lors de la déconnexion "brutale" du client ou du serveur (câble réseau déconnecté par exemple), je veux détecter cette déconnexion.
    Normalement, dans un tel cas, une exception doit être levée lorsqu'on envoie un message mais ce n'est pas toujours le cas: mon application continue à envoyer les messages comme si on est toujours connecté au réseau!!

    J'ai pensé faire un acquittement, dans ce cas si un message n'est pas acquitté après un certain timeout alors je dois supposé que je suis déconnecté.
    J'ai pensé meme à créer un genre de protocole que je peux utiliser pour faciliter l'interprétation des messages.
    Mais arrivant à la pratique je me sens un peu perdu..

    est ce que quelqu'un peut m'orienter un peu?
    et merci d'avance

  2. #2
    Modérateur
    Avatar de nouknouk
    Homme Profil pro
    Inscrit en
    Décembre 2006
    Messages
    1 655
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France

    Informations forums :
    Inscription : Décembre 2006
    Messages : 1 655
    Par défaut
    salut,
    Citation Envoyé par EAKOM Voir le message
    Mais arrivant à la pratique je me sens un peu perdu..
    est ce que quelqu'un peut m'orienter un peu ?
    Pourrais-tu détailler au maximum ce que tu attends comme aide, quels sont les points précis sur lesquels tu bloques, l'existant, ... ?

  3. #3
    Modérateur
    Avatar de dinobogan
    Homme Profil pro
    ingénieur
    Inscrit en
    Juin 2007
    Messages
    4 073
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France

    Informations professionnelles :
    Activité : ingénieur
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2007
    Messages : 4 073
    Par défaut
    Donne nous le code d'envoi des messages, le plus épuré possible. Tu dois sûrement catcher une exception de travers.
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java
    Que la force de la puissance soit avec le courage de ta sagesse.

  4. #4
    Membre confirmé
    Inscrit en
    Septembre 2008
    Messages
    77
    Détails du profil
    Informations forums :
    Inscription : Septembre 2008
    Messages : 77
    Par défaut
    Citation Envoyé par dinobogan Voir le message
    Donne nous le code d'envoi des messages, le plus épuré possible. Tu dois sûrement catcher une exception de travers.
    Merci pour tous de m'avoir répondu.

    Pour l'envoie des message j'utilise une méthode send:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    public class ClientCommunication extends Thread{
     
           .....
    	private     ObjectOutputStream  out    ;
            ......
     
           public void send(Object o) {
    	    try{
    	    	out.writeObject(o);
    	    }
    		catch (IOException e){
    		     afficherException(e);
    		}
    	}
    }
    L'objet out est bien instancié au constructeur:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    out = new ObjectOutputStream(sock.getOutputStream());

  5. #5
    Membre confirmé
    Inscrit en
    Septembre 2008
    Messages
    77
    Détails du profil
    Informations forums :
    Inscription : Septembre 2008
    Messages : 77
    Par défaut
    Citation Envoyé par nouknouk Voir le message
    salut,

    Pourrais-tu détailler au maximum ce que tu attends comme aide, quels sont les points précis sur lesquels tu bloques, l'existant, ... ?
    Mon problème est de détecter la déconnexion, donc j'ai pensé à faire un acquittement.
    comment réaliser cet acquittement? plus précisément comment l'attendre x ms après l'envoie du message?
    Pour la différenciation entre tout type de message, n'est il pas plus propre de créer un genre de protocole? Que dois je faire? y a-t-il des règles/normes à respecter?

    et Merci encore une fois

  6. #6
    Expert éminent
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 482
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 482
    Par défaut
    une déconnection brutale de l'autre point, si il n'est pas sur le meme réseau physique, peut prendre du temps.
    Le plus simple que je vois en java c'est
    1. Tu défini le sotimeout de la socket à, disons 60 secondes, des deux cotés.
    2. De chaque coté, tu t'assure que, si on a rien à envoyer pendan plus de 30 secondes, on envoie alors une donnée 'd'attente' qui permet de garder la connection en vie. Ca laisse 30 secondes de congestion réseau possible avant que l'autre partie déclenche le timeout.
    3. si on chope une erreur à la lecture due au sotimeout, on ferme la socket (reset)

  7. #7
    Modérateur
    Avatar de dinobogan
    Homme Profil pro
    ingénieur
    Inscrit en
    Juin 2007
    Messages
    4 073
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France

    Informations professionnelles :
    Activité : ingénieur
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2007
    Messages : 4 073
    Par défaut
    Tente également de faire un "flush" sur l'objet "out" juste après le "writeObject" : dit nous si ça améliore la détection.
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java
    Que la force de la puissance soit avec le courage de ta sagesse.

  8. #8
    Membre éprouvé
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    132
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Mai 2007
    Messages : 132
    Par défaut
    La solution du ack semble être bonne.

    Comme l'a déja "tchize_" dit La problème lors d'une déconnexion brutale d'un host, le couche TCP peut-être très lente et même un close peut prendre pas loin d'une heure (tout dépend de la configuration de la couche TCP).

    Donc il faut aussi utiliser l'option SoLinger afin d'éviter que le close de la socket ne bloque (ou alors rendre le close asynchrone ...)

    Sinon je ne pense pas qu'il y est de régles :
    * Le serveur envoie un commande de type ping a tous ces clients.
    * Si un des clients ne répond pas --> on le tue

Discussions similaires

  1. Réponses: 10
    Dernier message: 14/04/2005, 22h57
  2. [TP][Projet] Réaliser un Snake-Like
    Par Giovanny Temgoua dans le forum Turbo Pascal
    Réponses: 69
    Dernier message: 17/01/2005, 18h04
  3. [RUP] Use case and use case realisation
    Par Yveke dans le forum Cas d'utilisation
    Réponses: 11
    Dernier message: 18/11/2004, 11h24
  4. Mailleure facon de realiser une association infini-infini
    Par remi_phbc dans le forum Décisions SGBD
    Réponses: 4
    Dernier message: 15/07/2004, 12h31
  5. Realiser une tempo sur microcontrolleur
    Par Goetz dans le forum C
    Réponses: 20
    Dernier message: 03/11/2003, 23h46

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo