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

Langage Java Discussion :

Réarmer un timeout à chaque réception du paquet sur le réseau


Sujet :

Langage Java

  1. #1
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2012
    Messages
    156
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Juin 2012
    Messages : 156
    Points : 59
    Points
    59
    Par défaut Réarmer un timeout à chaque réception du paquet sur le réseau
    J'ai crée un Thread qui sert à recevoir les données en provenance d'un client udp ecrit en C.
    Je dois réarmer un timer à chaque réception de paquet et je veux que le programme sort au bout de 2s après la réception du dernier paquet.
    comment puis je faire?

    pour l'instant le timeout réalisé est qu'au bout de 4 seconds le thread se termine.
    La classe pour réaliser un timeout est :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    public class Timeout extends TimerTask {
     
    		boolean timeout = false;
     
    		public void run() {
     
    			this.timeout = true; // interrupt execution
    			Log.d(TAG,"Thread is up");					
     
    		}
    	}

    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
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
     
    public class Handler implements Runnable  {
     
    		public udp_packet_header header;
    		Timer timer;
    		byte[] DataOut;
     
    		public void run() {
     
    			try {
    				DataOut = new byte[1024];
    				Log.d(TAG, "restart socket");
    				socket = new DatagramSocket(SERVER_PORT);
    				socket.setReuseAddress(true);
    				socket.setBroadcast(true);
    				packetIn = new DatagramPacket(DataOut, DataOut.length);
    				Log.d(TAG, "waiting for incomming packets ...");
     
    				timer = new Timer();
    				Timeout timertask = new Timeout();
    				timer.schedule(timertask,4000); //4 seconds
     
    				while(timertask.timeout == false) {
     
    					Log.d(TAG,"bool :" + timertask.timeout);
    					Log.d(TAG, "wait message ...");
    					socket.receive(packetIn); 
     
    	                String comming = "from " + packetIn.getAddress() + ", " +
    	                		packetIn.getPort();
     
     
    	                Log.d(TAG,""+ comming);
     
    	                byte [] data = packetIn.getData();
    	                header = new udp_packet_header(data);
     
    	                System.out.println(header.ID);
    	                System.out.println(header.numberpacket);
    	                System.out.println(header.delay_ms);
     
    					Log.d(TAG, "receive new packet...");
     
    				}// end while
     
    				 socket.close();
    				 Log.d(TAG, "End of recvthread...");
    				 Log.d(TAG,"New Thread started");
     
    			} catch (UnknownHostException exc) {
    				Log.e(ERROR,"UnknownHostException :",exc);
    			} catch (SocketException exc) {
    				Log.e(ERROR,"Problem openning socket !",exc);
    			} catch (IOException exc) {
    				Log.e(ERROR,"Problem in reception of messages : ",exc);
    			}catch(IllegalArgumentException i){
    				Log.e(ERROR,"IllegalArgumentException : ",i);
    			}
     
     
    		}
     
    	}

    Une autre chose qui me gène c'est lorsque je remplace dans ma boucle la condition timertask.timeout == false par true j'obtiens une erreur dans la ligne qui suit la fin de la boucle.

  2. #2
    Membre confirmé Avatar de NicoL__
    Homme Profil pro
    Architecte
    Inscrit en
    Janvier 2011
    Messages
    399
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Architecte

    Informations forums :
    Inscription : Janvier 2011
    Messages : 399
    Points : 577
    Points
    577
    Par défaut
    C'est bien compliqué pourquoi passer par une timerTask pour gérer un boolean...
    Il y a une erreur quand tu mets == true car alors tu ne passes pas dans le while et tu n'as donc rien reçu...
    normalement il faut faire un wait dans ton wihle et écouter boucler un certain nombre de fois maximum au travers d'un compteur ce qui donne le timeout. Tu réinitialise le compteur pour continuer à écouter. Par contre il te faut probablement traiter ton message dans un autre thread pour continuer à écouter le socket.

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

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

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 481
    Points : 48 806
    Points
    48 806
    Par défaut
    Pour répondre à la question de base (réinitialiser le timer)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    				Timeout timertask = new Timeout();
    				timer.schedule(timertask,4000); //4 seconds
     
    				while(timertask.timeout == false) {
     
    					Log.d(TAG,"bool :" + timertask.timeout);
    					Log.d(TAG, "wait message ...");
    					socket.receive(packetIn);
    					timertask.cancel();
    					timertask = new Timeout();
    					timer.schedule(timertask,4000);

    Je suis d'accord avec nicol, tu part sur une méthode tordue (timer, threads, etc) alors qu'il te suffit sur ton DatagramSocket d'appeler

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    socket.setSoTimeout(4000);
    et tu recevra un joli "InterruptedException" si tu attends plus de 4 secondes les données.

  4. #4
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2012
    Messages
    156
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Juin 2012
    Messages : 156
    Points : 59
    Points
    59
    Par défaut
    si je fait le socket.setSotimeout() avant le receive, elle arrete la socket de recevoir des packets au bout des 4 seconds moi je veux qu'il s'arrete que lorsqu'il n y'a plus de paquets à recevoir... càd elle doit attendre la fin de l'émission de tous les paquets et après se mettre à attendre si il n'ya pas de paquets je sors

  5. #5
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2012
    Messages
    156
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Juin 2012
    Messages : 156
    Points : 59
    Points
    59
    Par défaut
    comment pourrais je faire pour détecter la fin de l'émission ?

  6. #6
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2012
    Messages
    156
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Juin 2012
    Messages : 156
    Points : 59
    Points
    59
    Par défaut
    Nicol
    Est ce que tu peux donner un exemple de ce que tu dis pour bien comprendre ?

  7. #7
    Membre confirmé Avatar de NicoL__
    Homme Profil pro
    Architecte
    Inscrit en
    Janvier 2011
    Messages
    399
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Architecte

    Informations forums :
    Inscription : Janvier 2011
    Messages : 399
    Points : 577
    Points
    577
    Par défaut
    Comme le dit tchize_ la gestion du timeout est incluse dans ta socket de base. En suite si tu veux enchaîner la lecture des message et bien il faut le coder et si ton traitement est long peut être lancer des thread pour traiter chaque paquet.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    socket.setSotimeout(4000);
    while(1) {
     
          Log.d(TAG, "wait message ...");
          packetIn = new DatagramPacket(DataOut, DataOut.length);
          socket.receive(packetIn);
           Log.d(TAG, "message reçu");
          //LANCER UN THREAD POUR TRAITER LE packetIn
           Log.d(TAG, "traitement lancé");
     
    }
    C'est une exception Timeout qui fera que le programme sort de la boucle while

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

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

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 481
    Points : 48 806
    Points
    48 806
    Par défaut
    Citation Envoyé par nabil.brarou Voir le message
    comment pourrais je faire pour détecter la fin de l'émission ?
    Soit quand la socket est fermée (indétectable avec des datagrammes)
    Soit en timeout (ce que visiblement tu as changé d'avis, tu ne veux plus)
    Soit ton client, avant de fermer, dit "Coucou, je n'ai plus rien à t'envoyer, au revoir", et quand tu vois ça passer, tu peux arrêter.

Discussions similaires

  1. Réponses: 8
    Dernier message: 26/07/2010, 09h07
  2. [VB6]Réception de données sur port série
    Par lindecker dans le forum VB 6 et antérieur
    Réponses: 5
    Dernier message: 08/03/2006, 06h48
  3. Réponses: 5
    Dernier message: 11/03/2004, 15h34
  4. Redimensionnement des Paquets IP sur un Réseau Local
    Par Bonoboo dans le forum Développement
    Réponses: 2
    Dernier message: 12/07/2002, 15h40

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