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 :

Gestion des flux avec une Socket


Sujet :

Langage Java

  1. #1
    Membre actif
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    333
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2007
    Messages : 333
    Points : 295
    Points
    295
    Par défaut Gestion des flux avec une Socket
    Bonjour à tous,

    Je travaille avec un serveur distant que je peux interroger sur une socket

    J'ai les 2 méthodes suivantes (à la fin ) qui fonctionnent ....

    Mais ... lorsque je ferme le flux de lecture (les 3 lignes dans la dernière méthode), il semble que le serveur ne reçoit pas le message de fin (MESSAGE_FIN) d'utilisation (ce qui fait que le nombre de thread augmente avec le tps ).

    Si je commentes les lignes tous fonctionne bien, mais ça me dérange de ne pas fermer ces flux.

    Je pensais que la lecture et l'écriture étaient relativement indépendantes.
    ça ne semble pas être le cas.

    Questions :
    Est ce que j'ai fait quelque chose de mal ?
    Quel est la bonne pratique sur ce point ?

    Merci

    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
     
    	public List send(IRequete requete) {
    		List liste = new ArrayList();
    		OutputStream outputStream = null;
    		PrintStream fluxSortieSocket = null;
    		try {
    			outputStream = socket.getOutputStream();
    			fluxSortieSocket = new PrintStream(outputStream);
    			String message = requete.toMessage();
    			fluxSortieSocket.println(message);
    			liste = readResponse();
    			fluxSortieSocket.println(MESSAGE_FIN);
    			socket.close();
    		} catch (Exception e) {
    			log(...)
    		} finally {
    			fluxSortieSocket.close();
    			try {
    				outputStream.close();
    			} catch (IOException e) {
    				logger.warn("...", e);
    			}
    		}
    		return liste;
    	}

    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
    	private List readResponse() {
    		InputStream inputStream = null;
    		InputStreamReader inputStreamReader = null;
    		BufferedReader fluxEntreeSocket = null;
    		List liste = new ArrayList();
    		try {
    			inputStream = socket.getInputStream();
    			inputStreamReader = new InputStreamReader(inputStream);
    			fluxEntreeSocket = new BufferedReader(inputStreamReader);
    			String line = fluxEntreeSocket.readLine();
    			logger.debug("Ligne réponse :"+line);
    			Reponse creationReponse = Factory.creationReponse(line);
     
    			while (creationReponse != null) {
    				liste.add(creationReponse);
    				line = fluxEntreeSocket.readLine();
     
    				creationReponse = Factory.creationReponse(line);
    			}
    		} catch (IOException e) {
    			logger.error("...", e);
    		} finally {
    			try {
     
    // ICI ces 3 lignes posent problème 
    				fluxEntreeSocket.close();
    				inputStreamReader.close();
    				inputStream.close();
    			} catch (IOException e) {
    			}
    		}
    		return liste;
    	}

  2. #2
    Expert éminent sénior
    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 : 45
    Localisation : Belgique

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

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 482
    Points : 48 807
    Points
    48 807
    Par défaut
    vous devez fermer le flux de sortie avant la socket, et pas l'inverse.

  3. #3
    Membre actif
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    333
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2007
    Messages : 333
    Points : 295
    Points
    295
    Par défaut
    effectivement

    mais le problème persiste avec cette méthode

    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
     
    	public List send(IRequete requete) {
    		List liste = new ArrayList();
    		OutputStream outputStream = null;
    		PrintStream fluxSortieSocket = null;
    		try {
    			outputStream = socket.getOutputStream();
    			fluxSortieSocket = new PrintStream(outputStream);
    			String message = requete.toMessage();
    			fluxSortieSocket.println(message);
    			liste = readResponse();
    			fluxSortieSocket.println(MESSAGE_FIN);
     
    		} catch (Exception e) {
    			log(...)
    		} finally {
    			try {
    				fluxSortieSocket.close();
    				outputStream.close();
    				socket.close();
    			} catch (IOException e) {
    				logger.warn("...", e);
    			}
    		}
    		return liste;
    	}

  4. #4
    Expert éminent sénior
    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 : 45
    Localisation : Belgique

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

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 482
    Points : 48 807
    Points
    48 807
    Par défaut
    on peux voir le coté serveur qui recois le message?

  5. #5
    Membre actif
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    333
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2007
    Messages : 333
    Points : 295
    Points
    295
    Par défaut
    si seulement .... ou même avoir des logs dessus serait bien ...

    Mais je suis en développement super moderne ... avec une méthode dite de la black box serveur ....

    Le service marche "super trop bien ... il est super performant (c'est du c ).... par contre tu as pas accès au code et y a pas trop de doc"

    Donc j'en suis réduit à de l'expérimentation ....

  6. #6
    Expert éminent sénior
    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 : 45
    Localisation : Belgique

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

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 482
    Points : 48 807
    Points
    48 807
    Par défaut
    sniffez la connexion pour voir si le message est parti.
    Sinon si le serveur blackbox il marche trop bien, vous cassez pas la nenette. Fermez proprement vos connexions et laissez le se vautrer lamentablement

  7. #7
    Membre actif
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    333
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2007
    Messages : 333
    Points : 295
    Points
    295
    Par défaut
    Bon j'ai enfin eu un peu de temps pour avancer sur ce point

    Alors j'ai essayé de sniffer les trames qui passaient et il en manque bien lorsque je ferme les flux de lecture avant d'envoyer le message de fin.
    (Ma connaissance des protocoles réseaux et des formats trames est assez faible .... mais il me semble bien que le message de fin n'est pas envoyé)

    J'ai déplacé les variables pour en faire des attributs et je ferme les flux de lecture après l'envoi du dernier message .... et ça marche nickel

    Par contre je comprends toujours pas ce qui se passe dans la jvm

    Voila le code qui fonctionne pour info :
    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
    public List send(IRequete requete) {
    		List liste = new ArrayList();
    		OutputStream outputStream = null;
    		PrintStream fluxSortieSocket = null;
    		try {
    			outputStream = socket.getOutputStream();
    			fluxSortieSocket = new PrintStream(outputStream);
    			String message = requete.toMessage();
    			fluxSortieSocket.println(message);
    			liste = readResponse();
    			fluxSortieSocket.println(MESSAGE_FIN);
     
    		} catch (Exception e) {
    			log(...)
    		} finally {
    			try {
     
    // ICI ces 3 lignes ne posent plus de problème :)
    				fluxEntreeSocket.close();
    				inputStreamReader.close();
    				inputStream.close();
    			} catch (IOException e) {
    logger.warn("...", e);
    			}
     
    			try {
    				fluxSortieSocket.close();
    				outputStream.close();
    				socket.close();
    			} catch (IOException e) {
    				logger.warn("...", e);
    			}
    		}
    		return liste;
    	}
    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
    private List readResponse() {
    		inputStream = null;
    		inputStreamReader = null;
    		fluxEntreeSocket = null;
    		List liste = new ArrayList();
    		try {
    			inputStream = socket.getInputStream();
    			inputStreamReader = new InputStreamReader(inputStream);
    			fluxEntreeSocket = new BufferedReader(inputStreamReader);
    			String line = fluxEntreeSocket.readLine();
    			logger.debug("Ligne réponse :"+line);
    			Reponse creationReponse = Factory.creationReponse(line);
     
    			while (creationReponse != null) {
    				liste.add(creationReponse);
    				line = fluxEntreeSocket.readLine();
     
    				creationReponse = Factory.creationReponse(line);
    			}
    		} catch (IOException e) {
    			logger.error("...", e);
    		} 
    		return liste;
    	}

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Gestion des libellés avec une seule table
    Par scharly3 dans le forum Microsoft BI
    Réponses: 7
    Dernier message: 02/03/2012, 22h41
  2. Gestion des évènements avec une superposition d'éléments
    Par Meardon dans le forum Général JavaScript
    Réponses: 4
    Dernier message: 26/10/2008, 14h47
  3. Gestion des collisions avec Allegro et une matrice
    Par yetimothee dans le forum Allegro
    Réponses: 4
    Dernier message: 22/06/2008, 18h38
  4. [J2EE/JSP] Gestion des erreurs avec une base SQL server 2005
    Par critok dans le forum Servlets/JSP
    Réponses: 3
    Dernier message: 30/04/2006, 16h57
  5. Gestion des chemins des images avec une base de données...
    Par Nean dans le forum Bases de données
    Réponses: 4
    Dernier message: 27/07/2005, 08h08

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