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 :

informations sur les sockets


Sujet :

Langage Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    40
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 40
    Par défaut informations sur les sockets
    Bonjour à tous,
    j'ai un projet à réaliser en java sur lequel un client en java (moi) se connect sur un serveur réalisé en langage C (distant) à l'aide des sockets qui ce dernier me renvoit des données.
    Ma question est la suivante :
    Y aurait-il la possibilité de recevoir une structure (plutôt de la lire exemple : e=in.readLine() ) d'un serveur C par socket sur un client java ?
    Ou doit-on instaurer un protocole dans lequel les trames seront sur une ligne.
    Merci

  2. #2
    Membre très actif
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2003
    Messages
    321
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 321
    Par défaut
    Si tu comptes lire des données binaire, je ne pense pas que tu utilise des methodes du style readLine de BufferedReader sachant que cela est plus adapté pour la lecture de données textuelles. Je t'invite a consulter l'API pour la classe DataInputStream par exemple qui te permet de lire des types primitifs a partir de tes sockets. Maintenant lire une structure en tant que telle, je ne pense pas ...

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    40
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 40
    Par défaut informations sur les sockets
    Merci pour la réponse leyee !
    J'ai essayé de passer par les DataInputStream enfin je vais tout tester pour savoir par quelle méthode je vais arriver à lire ce que m'envoi le C++ sans que les 2 programmes bloquent.Mais il me renvoi une erreur :

    "client.java" : Erreur No. 300 : constructeur BufferedInputStream(java.io.InputStreamReader) introuvable dans classe java.io.BufferedInputStream en ligne 29, colonne 52
    sur cette ligne de code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    DataInputStream din = new DataInputStream(new BufferedInputStream(new InputStreamReader(socket.getInputStream())));
    Voici mes imports :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    import java.io.*;
    import java.net.*;import java.util.*;
    import java.io.DataInputStream;
    et un bout de mon code :
    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
     // Création des flots d'entrée/sortie
         PrintWriter out=new PrintWriter(socket.getOutputStream(),true);
         BufferedReader in=new BufferedReader(new InputStreamReader(socket.getInputStream()));
         BufferedReader stdin=new BufferedReader(new InputStreamReader(System.in));
     
         //Reader reader = new InputStreamReader(socket.getInputStream());
         //BufferedReader datainput = new BufferedReader(reader);
         BufferedReader datainput =new BufferedReader(new InputStreamReader(socket.getInputStream()));
         DataInputStream din = new DataInputStream(new BufferedInputStream(new InputStreamReader(socket.getInputStream())));
     
         byte[] data = {0} ;
         DataInputStream dis = new DataInputStream(new ByteArrayInputStream(data)); 
            int rus = din.readUnsignedShort();
           int rub = din.readUnsignedByte();
           char c = din.readChar();
           byte b =din.readByte();
           String utf=din.readUTF();
           String donn= dis.readUTF();
    Y aurait-il quelqu'un pour me dire se qu'il ne va pas ! ca fait 3 h que je cherche ... :

  4. #4
    Membre Expert
    Profil pro
    Fabrication GED
    Inscrit en
    Octobre 2005
    Messages
    1 405
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Activité : Fabrication GED

    Informations forums :
    Inscription : Octobre 2005
    Messages : 1 405
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    DataInputStream din = new DataInputStream(new BufferedInputStream(socket.getInputStream()));
    devrait mieux fonctionner non ?

  5. #5
    Membre averti
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    40
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 40
    Par défaut
    Oui effectivement ca marche mais je n'arrive pas à communiquer avec le serveur qui est fait en C++. J'arrive à me connecter à lui mais quand il m'envoi un caractère (char) que je ne recoit pas.En faite après un débug je vois que j'arrive a me connecter mais après cela les 2 programmes sont comme figés. Je me suis renseigner la dessus et cela viendrait de ma lecture de son caractère qu'il m'envoi (les normes sont différentes d'un language a l'autre).

    J'ai essayé ceci le tout dans un try mais rien n'y fait ! ca passe dans le catch direct après tentative de lecture.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     entree=in.readLine();
             int rus = din.readUnsignedShort();
              int rub = din.readUnsignedByte();
             char c = din.readChar();
             byte b =din.readByte();
             String donn= din.readUTF();
    Quelqu'un aurait-il la solution ?
    snif ...

  6. #6
    Membre averti
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    40
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 40
    Par défaut
    J'ai omis le principal ! Merci iohack

  7. #7
    Rédacteur
    Avatar de bulbo
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Février 2004
    Messages
    1 259
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : Finance

    Informations forums :
    Inscription : Février 2004
    Messages : 1 259
    Par défaut
    Citation Envoyé par 2tsiris
    Oui effectivement ca marche mais je n'arrive pas à communiquer avec le serveur qui est fait en C++. J'arrive à me connecter à lui mais quand il m'envoi un caractère (char) que je ne recoit pas.En faite après un débug je vois que j'arrive a me connecter mais après cela les 2 programmes sont comme figés. Je me suis renseigner la dessus et cela viendrait de ma lecture de son caractère qu'il m'envoi (les normes sont différentes d'un language a l'autre).

    J'ai essayé ceci le tout dans un try mais rien n'y fait ! ca passe dans le catch direct après tentative de lecture.



    Quelqu'un aurait-il la solution ?
    snif ...
    Attention les types en C++ et en java different, notamment lors de leurs ecritures sur une socket, java t'assure de toujours respecter le meme ordre d'ecriture des bytes (notamment pour un long) alors que le C++ se base sur la machine hote et suivant que tu es en BigEndian ou LittleEndian ton long arrivera dans un ordre different de l'autre cote.

    Ensuite ton programme bloque surement a cause de ton readLine.
    Es-tu sur que le caractere fin de ligne est bien envoye par le serveur C++ ?

    Moi ce que je ferais c'est lire byte par byte ce que je recois de C++ et remettre ca dans une forme comprehensible par java a la main.

    Mieux si tu as aussi le controle sur le cote C++, tu mets tout ce que tu veux envoyer sous forme de chaine et tu ecris tout ca sur la socket eventuellement avec des caracteres de separation histoire d'aider au parsing et ensuite du cote java tu parses les differentes choses envoyees par le serveur C++.

    Bulbo
    [Java] [NetBeans] [CVS]
    La FAQ Java
    Merci de ne pas me poser de questions techniques par MP.

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

Discussions similaires

  1. demande d'information sur les socket
    Par yacin87 dans le forum Entrée/Sortie
    Réponses: 0
    Dernier message: 10/04/2010, 20h03
  2. Informations sur les sockets
    Par paihpaihtte dans le forum Réseau
    Réponses: 18
    Dernier message: 20/02/2007, 13h30
  3. Informations sur les sockets
    Par liazidf dans le forum Delphi
    Réponses: 3
    Dernier message: 13/07/2006, 12h38
  4. Informations sur les procédures stockées
    Par jfphan dans le forum MS SQL Server
    Réponses: 4
    Dernier message: 13/01/2004, 14h30
  5. Questionsssss sur les sockets?
    Par Nino dans le forum Développement
    Réponses: 5
    Dernier message: 01/04/2003, 21h11

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