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

Entrée/Sortie Java Discussion :

Socket et Streams


Sujet :

Entrée/Sortie Java

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Août 2007
    Messages
    18
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 18
    Points : 12
    Points
    12
    Par défaut Socket et Streams
    Bonsoir,

    J'ai une appli client/serveur.
    Les utilisateurs peuvent utiliser 3 types de clients. Mon client Java, Telnet ou un butineur.
    Afin de pouvoir utiliser les méthodes adéquates j'ai besoin de savoir de quel type est mon client. Pour cela je récupère la première chaîne envoyée par le client.
    Soit les Header Http soit la chaine "Nouveau Client: username" envoyé par le client java.
    Seulement pour le moment je n'ai considéré que mon client Java donc tous les échanges se font avec des ObjectInputStream.
    J'ai modifié le code pour tenir compte du butineur mais du coup cela ne marche qu'avec le butineur et bloquant pour le reste comme ci dessou
    Voila un bout de mon thread serveur:

    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
    public void run() {
        is = connexion.getInputStream();
        os = connexion.getOutputStream();
        BufferedReader in = new BufferedReader(new InputStreamReader(is));
        PrintWriter out = new PrintWriter(os);
        String login= in.readLine();
        if (login.startsWith("Nouveau client"))
        {
            //impossible ici de redéfinir les flux?
            ois= new ObjectInputStream(is);
            //Code bloquant ici. Pourtant j'ai besoin d'un Object Input stream :s
            oos = new ObjectOutputStream(os);
            username = login.substring(15);
            if (username.equalsIgnoreCase("anonyme"))
            {
                username+=numClient;
                System.out.println("Arrivee de " + username + ".");
                oos.writeObject("Connection acceptée");
                oos.flush();
    //suite du code et envoi/reception d'objet avec le client java
            }
        }
        //Si c'est un client HTTP
        else if (login.matches("GET \\w+"))
        {
           //dans ce cas ca marche puisque les flux BufferedReader et PrintWriter ont été définis en premier
            out.println("Bienvenue Client http");
            //suite du code
        }
    Dans le cas ci dessus, aucun problème pour le navigateur mais bloquage du client java sur le ObjectOutputStream oos = new ObjectOutputStream(os)
    Si je défini les ObjectInput/OutputStreams en premier alors le client java passe
    mais pas
    Ma question est donc de savoir si il est possible d'utiliser plusieurs flux dans la même socket. Sinon est ce que je peux "fermer" un des flux et en réouvrir un autre?
    J'ai essayé de manipuler les InputStream et OutputStream directement mais je n'ai pas réussi, même chose avec les DataInputStream

    Merci

  2. #2
    Modérateur
    Avatar de dinobogan
    Homme Profil pro
    ingénieur
    Inscrit en
    Juin 2007
    Messages
    4 073
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France

    Informations professionnelles :
    Activité : ingénieur
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2007
    Messages : 4 073
    Points : 7 163
    Points
    7 163
    Par défaut
    Le serveur doit créer un nouveau Thread pour chaque nouveau client connecté. C'est ce que tu fais ?
    Le port d'écoute du serveur est seulement un point d'entré. Le serveur fait uniquement de l'écoute, et à la rigueur un peu de "routage" (si le nombre de client est faible) pour lancer les bons Thread de traitement selon les clients, mais rien de plus.

  3. #3
    Membre à l'essai
    Profil pro
    Inscrit en
    Août 2007
    Messages
    18
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 18
    Points : 12
    Points
    12
    Par défaut
    Merci de ta réponse. Effectivement, mon serveur est multithread.
    Seulement mon problème est de savoir si on peut utiliser dans le même thread 2 types d'InputStream différents.

    Je voudrais faire ca mais ca ne marche pas.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     is = connexion.getInputStream();
        os = connexion.getOutputStream();
        BufferedReader in = new BufferedReader(new InputStreamReader(is));
        PrintWriter out = new PrintWriter(os);
        ObjectInputStream ois= new ObjectInputStream(is); //StreamCorrputedException
        ObjectOutputStream oos = new ObjectOutputStream(os);
    J'ai un StreamCorruptedException: invalidStreamHeader lors de la création du 2eme flux.

  4. #4
    Modérateur
    Avatar de dinobogan
    Homme Profil pro
    ingénieur
    Inscrit en
    Juin 2007
    Messages
    4 073
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France

    Informations professionnelles :
    Activité : ingénieur
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2007
    Messages : 4 073
    Points : 7 163
    Points
    7 163
    Par défaut
    Non, ce n'est pas possible. C'est pour cela que le serveur créé un nouveau flux entrée/sortie pour chaque nouveau client. Les dialogues des clients sont tous indépendants.

  5. #5
    Membre à l'essai
    Profil pro
    Inscrit en
    Août 2007
    Messages
    18
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 18
    Points : 12
    Points
    12
    Par défaut
    Ok.
    J'ai tout fait en flux de caractères finalement. C'est pas terrible mais je suis pris par le temps.

Discussions similaires

  1. Envoi de Memory Stream par Socket
    Par Link3 dans le forum Windows Forms
    Réponses: 3
    Dernier message: 21/08/2008, 15h25
  2. fuite de memoire, socket et Stream
    Par kuguy dans le forum Entrée/Sortie
    Réponses: 8
    Dernier message: 06/03/2008, 09h06
  3. [Socket&Stream] Plusieurs streams sur une même socket
    Par Napalm51 dans le forum Entrée/Sortie
    Réponses: 4
    Dernier message: 15/11/2007, 15h40
  4. event sur des streams de socket
    Par quicky2000 dans le forum Entrée/Sortie
    Réponses: 4
    Dernier message: 02/11/2007, 16h34
  5. Transfert d'une image par socket stream
    Par francky23012301 dans le forum Langage
    Réponses: 1
    Dernier message: 31/10/2005, 16h06

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