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

  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 .

  7. #7
    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
    Ba le problème est toujours là
    Côté serveur, j'ai fait un print et non un println par exemple et si je me connecte depuis telnet sur le serveur, je reçois bien les chaines envoyées! Alors pourquoi quand je code un client, je suis obligé de passer par un println ?

    Hypothèse : sur le serveur, je lis avec la méthode readLine() qui d'après la doc Java, attend un \n pour s'exécuter! Alors je pense que c'est ça mais dans ce cas, faut que je sois sûr que le '\n' ne génera pas la reconnaissance du serveur. Je demanderai au prof car c'est lui qui a codé la version "officielle" du serveur

    Et oui, c'est GALÈRE !! Merci

    Nas'

  8. #8
    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
    Citation Envoyé par Nasky
    Hypothèse : sur le serveur, je lis avec la méthode readLine() qui d'après la doc Java, attend un \n pour s'exécuter! Alors je pense que c'est ça mais dans ce cas, faut que je sois sûr que le '\n' ne génera pas la reconnaissance du serveur.
    Comment tu veux qu'il "gène" la reconnaissance du serveur ? Je ne comprend pas ce qui te gène. Si tu veux dire que le serveur n'arrivera pas à reconnaitre un message protocolaire, sache que le '\n' n'est pas inclue dans le message retourné par la méthode readLine().

  9. #9
    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
    Ah et bien dans ce cas, le problème est réglé Je viens du monde du langage C alors une chaine de caractère, c'était un tableau de caractères où le '\n' est très important, etc. Le Java semble plus souple de ce côté-là donc c'est tant mieux!

    Merci beaucoup pour ton aide à une heure pareille

    Je suis sur un autre problème, toujours sur un readLine() mais côté client cette-fois Je vais poster un nouveau thread si j'arrive pas à le résoudre d'ici quelques minutes

    Nas'

+ 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, 04h34
  2. Réponses: 2
    Dernier message: 29/08/2006, 16h27
  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, 21h03
  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, 10h02

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