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éseau] Le client envoie juste après la fermeture


Sujet :

Langage Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre émérite
    Profil pro
    Eleveur de cornichons
    Inscrit en
    Juin 2002
    Messages
    1 074
    Détails du profil
    Informations personnelles :
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : Eleveur de cornichons
    Secteur : Finance

    Informations forums :
    Inscription : Juin 2002
    Messages : 1 074
    Par défaut [Réseau] Le client envoie juste après la fermeture
    Bonjour

    J'ai un client Java qui envoie des données à un serveur Java.
    Lorsque je lance le serveur, il exécute ce bout de code qui attend la réception de données (j'ai laissé que l'essentiel) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
          csock = ssock.accept();
                	// creer les flux d'ES vers ce joueur et les ajouter
                	createStreams(csock);
                	// recuperer l'indice du client = le dernier connecte
                	int ind = 0 ;
                	// lire l'inscription et ajouter le pseudo a la liste des joueurs
                	String name = getNickname(receiveData(ind)) ;
                	//String name = receiveData(ind) ;
                	System.out.println(name);
    Je reçois bien l'information seulement le problème, c'est que le serveur affiche le nom reçu seulement quand le client se ferme donc je suppose que le client envoie réellement les données uniquement en se fermant.
    Le code de receiveData est tout simple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    private String receiveData(int ind) throws IOException
     {
        	   return (String)((BufferedReader)fromPlayersStreamList.get(ind)).readLine();
      }
    Voilà comment j'envoie côté client :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    public void sendData(String req) 
     {
        	toServer.print(req);
        	toServer.flush(); 
        	System.out.println("Sent!");
     }
    avec toServer qui est un PrintWriter ...

    Bref, je pensais que la méthode flush() forcerait l'envoi de donnée mais ce n'est pas le cas. C'est uniquement en fermant le client que le serveur affiche le nom reçu... sans erreur ni côté serveur ni côté client.

    Voyez-vous quelque chose de bizarre ?

    Nas'

  2. #2
    Membre éprouvé
    Avatar de Janitrix
    Inscrit en
    Octobre 2005
    Messages
    3 391
    Détails du profil
    Informations forums :
    Inscription : Octobre 2005
    Messages : 3 391
    Par défaut
    Tu pourrais montrer le code de la méthode createStreams s'il te plait ? Merci.
    Ensuite, dans la méthode sendData du client, as-tu essayé de fermer le PrintWriter après envoie ? Bon courage.

  3. #3
    Membre émérite
    Profil pro
    Eleveur de cornichons
    Inscrit en
    Juin 2002
    Messages
    1 074
    Détails du profil
    Informations personnelles :
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : Eleveur de cornichons
    Secteur : Finance

    Informations forums :
    Inscription : Juin 2002
    Messages : 1 074
    Par défaut
    Bonjour

    Alors avant de répondre à tes questions, je viens de mettre un println à la place du print dans la méthode sendData() et là ça marche !! Je pensais que le flush() avait le même effet qu'un '\n' et qu'il forçait l'envoi... Apparament, seul le 'ln' fait cela

    Sinon, je n'ai pas essayé en fermant le stream mais de toute façon, j'espère que ce n'est pas obligatoire car j'aimerais bien continuer le dialogue client/serveur après au-delà de l'envoi d'une seule donnée

    Voici le code de createStreams :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    private void createStreams(Socket sock) throws IOException
           {
    	 		//flux sortant
    	        PrintWriter toClient = new PrintWriter(
    	                      new BufferedOutputStream(sock.getOutputStream()), false);
    	        // flux entrant
    	        BufferedReader fromClient = new BufferedReader(
    	                      new InputStreamReader(sock.getInputStream()));
     
    	        toPlayersStreamList.add(toClient) ; // ajouter une reference vers ce client en sortie
    	        fromPlayersStreamList.add(fromClient); // idem en entree
     
        	}
    Je mets les flux dans une List c'est pour ça qu'on retrouve ça dans receiveData().

    Merci

    Nas'

  4. #4
    Membre éprouvé
    Avatar de Janitrix
    Inscrit en
    Octobre 2005
    Messages
    3 391
    Détails du profil
    Informations forums :
    Inscription : Octobre 2005
    Messages : 3 391
    Par défaut
    Bon apparemment ton problème est réglé . Un petit tag résolu et on retrouve vite sa tasse de café pour tenir encore quelques heures . Bon courage !

  5. #5
    Membre émérite
    Profil pro
    Eleveur de cornichons
    Inscrit en
    Juin 2002
    Messages
    1 074
    Détails du profil
    Informations personnelles :
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : Eleveur de cornichons
    Secteur : Finance

    Informations forums :
    Inscription : Juin 2002
    Messages : 1 074
    Par défaut
    Je ne sais pas si mon problème est résolu car je ne peux pas toucher au serveur.
    Or celui-ci attend des requêtes exactes donc si par exemple il attend la chaine LIST je ne sais pas si un println("LIST"); sera bien interprété par le serveur car peut-être qu'un '\n' est ajouté et que s'il compare ce que j'envoie avec ce qui est attendu, ça ne sera pas la même chose. Enfin je ne sais pas...

    Le café ? C'est quelque chose qui ressemble à de la farine qu'il me faudrait là (joke)

    Nas'

  6. #6
    Membre éprouvé
    Avatar de Janitrix
    Inscrit en
    Octobre 2005
    Messages
    3 391
    Détails du profil
    Informations forums :
    Inscription : Octobre 2005
    Messages : 3 391
    Par défaut
    Le '\n' n'est pas interprété pas le serveur. Mais pour ce genre de truc, il y a pas de miracle ni de guide, tu vas devoir tester par toi même. Par expérience, je peux te dire qu'il va te falloir être patient, parce que le débugage réseau est HORRIBLE, car il y a trop de facteur en jeu. Tu vas en bouffer des System.out.println(input); . Donc, je le répète, patience et courage sont tes seules armes. Bonne chance. Si jamais tu as un problème précis, tu sais quoi faire .

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

Discussions similaires

  1. bloquage d'un client de chat aprés l'envoi d'un message
    Par King_T dans le forum Débuter avec Java
    Réponses: 0
    Dernier message: 24/12/2008, 05h34
  2. Réponses: 2
    Dernier message: 29/08/2006, 17h27
  3. Trouver l'élément juste après en SQL ?
    Par marot_r dans le forum Requêtes et SQL.
    Réponses: 2
    Dernier message: 25/07/2006, 22h03
  4. [Win XP] La machine s'arrête seule juste après avoir démarré
    Par Giovanny Temgoua dans le forum Windows XP
    Réponses: 5
    Dernier message: 05/12/2005, 11h02

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