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 :

probleme avec chat


Sujet :

Entrée/Sortie Java

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Mai 2008
    Messages
    213
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2008
    Messages : 213
    Points : 43
    Points
    43
    Par défaut probleme avec chat
    Bonjour, je me suis recemment lancé dans un projet "'chat".
    Je bien de commencer, mais deja un probleme apparait.
    Voici les codes:

    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
    import java.net.*;
    import java.io.*;
     
    public class serveur {
     
        public static void main(String[] args) throws Exception {
            ServerSocket serveur = new ServerSocket(9334);
            String name;
            System.out.println("serveur initialisé");
            try {
                while(true) {
                  Socket client = serveur.accept();
                  BufferedReader reader = new BufferedReader(new InputStreamReader(client.getInputStream()));
                  name = reader.readLine();
                   threadServeur t = new threadServeur(client, name);
                   t.start();
                }
            }catch(Exception e) { e.printStackTrace(); }
        }
     
    }
    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
    import java.net.*;
    import java.io.*;
    import java.util.*;
     
    public class threadServeur extends Thread {
        Socket client;
        String name;
        Scanner sc = new Scanner(System.in);
     
        public threadServeur(Socket client, String name) {
            this.client = client;
            this.name = name;
        }
        public void run() {
            try {
                BufferedReader reader = new BufferedReader(new InputStreamReader(client.getInputStream()));
                BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(client.getOutputStream()));
                while(client.isConnected()) {
            String message = reader.readLine();
            System.out.println("message de " + name);
            System.out.println(message);
            String messageEnvoi = sc.nextLine();
            writer.write(messageEnvoi);
            writer.flush();
                }
            }catch(Exception e) { e.printStackTrace(); }
        }
     
    }
    client:

    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
    import java.net.*;
    import java.io.*;
    import java.util.*;
     
    public class client {
     
         public static void main(String[] args) throws Exception {
             System.out.println("client initialisé");
               int port = 9334;
               InetAddress ip = InetAddress.getLocalHost();
               Socket client = new Socket(ip, port);
               Scanner sc = new Scanner(System.in);
               String str;
               String message;
             try {
                 BufferedReader reader = new BufferedReader(new InputStreamReader(client.getInputStream()));
                 BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(client.getOutputStream()));
                 System.out.println("votre pseudo: ");
                 str = sc.nextLine();
                 writer.write(str);
                 writer.flush();
                 while(client.isConnected()) {
                     str = sc.nextLine();
                     writer.write(str);
                     writer.flush();
                    message = reader.readLine();
                 }
     
             }catch(Exception e) { e.printStackTrace(); }
     
         }
     
    }
    Comme vous pouvez le constater, je n'en sui qu'au debut, c'est normal qu'il n'y est presque rien.
    Laintenant voici le probleme:
    c'est dans l'envoie/recu des messages.
    A chaque fois, avant de pouvoir envoyer un message, il faut attendre qu'il lise un message, vu que la methode read bloque le code.
    J'aimerai donc savoir comment je peux faire pour que:
    l'on puisse envoyer ders messages comme on veut tout en affichant tout ce qui est recu.

    Merci d'avance pour vos reponses

  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
    Ton bufferedReader bloque. Soit tu fais 2 thread: 1 de lecture, un d'écriture (coté serveur çà va vite être lourd), soit tu ne passe pas par un bufferedReader, et tu attaque ton inputStream directement, en utilisant la méthode available() qui permet de savoir si on va ou non bloquer.

  3. #3
    Membre du Club
    Profil pro
    Inscrit en
    Mai 2008
    Messages
    213
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2008
    Messages : 213
    Points : 43
    Points
    43
    Par défaut
    ok merci beaucoup pour ta reponse, je vais essayer avec avaible();
    De toute facon je ne vois pas trop comment on ferai avec 2 thread differents.

    erdit: j'ai ete voir la doc sur available, le probleme c'est que si je fais un if avaible est different de nul je lit et que sinon j'ecris, la methode sc.nextLine(); bloque aussi le code.

  4. #4
    Membre du Club
    Profil pro
    Inscrit en
    Mai 2008
    Messages
    213
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2008
    Messages : 213
    Points : 43
    Points
    43
    Par défaut
    J'ai essayé pas mal de truc et ca ne marche toujours pas, il y a toujours un truc qui bloque. Peut etre n'ai je pas compris ce que tu voulais dire par attaquer directement mon inputStream?
    Serait ce vraiment genant si je faisait 2 thread?(c'est quand meme plus simple^^)

    Merci

  5. #5
    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
    Je ne vois pas comment tu pourrais faire avec un seul Thread.
    Dans le client, déclare un Thread qui va traiter ce qui est reçu par le serveur, et un second Thread qui gère l'entrée standard.

  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
    Citation Envoyé par xokami35x Voir le message
    J'ai essayé pas mal de truc et ca ne marche toujours pas, il y a toujours un truc qui bloque. Peut etre n'ai je pas compris ce que tu voulais dire par attaquer directement mon inputStream?
    Ca veux dire ne pas passer par des reader ou autre qui entoureraient le stream et nécessite de bloquer en attendant un \n.

  7. #7
    Membre du Club
    Profil pro
    Inscrit en
    Mai 2008
    Messages
    213
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2008
    Messages : 213
    Points : 43
    Points
    43
    Par défaut
    ok merci beaucoup de vos reponses.
    dinobogan: que veux tu dire par qui gere les entrees standards?
    sinon tchize, si j'ai bien compris, il faudrait que je supprime les buffer?
    est ce que ca va changer quelque chose autre que je ne pourrai plus lire de ligne?

  8. #8
    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
    Citation Envoyé par xokami35x Voir le message
    dinobogan: que veux tu dire par qui gere les entrees standards?
    L'entrée standard, c'est "System.in".

  9. #9
    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
    Citation Envoyé par xokami35x Voir le message
    ok merci beaucoup de vos reponses.
    dinobogan: que veux tu dire par qui gere les entrees standards?
    sinon tchize, si j'ai bien compris, il faudrait que je supprime les buffer?
    est ce que ca va changer quelque chose autre que je ne pourrai plus lire de ligne?
    Tu dois supprimer les bufferedReader, car ils sont d'office bloquant (il attendent d'avoir un \n pour retourner) et, les StreamReader car eux non plus n'ont pas de méthode available() qui tu pourrais utiliser pour savoir si il existe quelque chose à lire.

  10. #10
    Membre du Club
    Profil pro
    Inscrit en
    Mai 2008
    Messages
    213
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2008
    Messages : 213
    Points : 43
    Points
    43
    Par défaut
    ok merci beaucoup de votre precieuse aide.
    En fait je lis caracteres par caracteres et a chaque fois je verifie si il y a quelque chose à lire?

    Merci beaucoup

  11. #11
    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
    non pas tout a fait
    1) tu vérifie si il y a des trucs à lire
    2) tu lit tout un bloc avec read(byte[]), çà lira le maximum que çà peut lire sans bloquer.
    3) tu recommence en 1

    Note, ce sont pas des caractères que tu lit mes des octets

  12. #12
    Membre du Club
    Profil pro
    Inscrit en
    Mai 2008
    Messages
    213
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2008
    Messages : 213
    Points : 43
    Points
    43
    Par défaut
    ok merci beaucoup, je vais m'y remettre^^
    Si j'ai besoin d'aide je redemande

    Encore merci

  13. #13
    Membre du Club
    Profil pro
    Inscrit en
    Mai 2008
    Messages
    213
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2008
    Messages : 213
    Points : 43
    Points
    43
    Par défaut
    j'ai commencé, je viens de finir juste le debut, c'est a dire les echanges entrre serveurs/clients. Mais malheuresement il y a un truc qui ne marche pas.
    voici le code du thread serveur(je ne oste que celui ci vu que celui du client est presque identique):

    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
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
     package projetChat;
     
    import java.io.*;
    import java.net.*;
    import java.util.*;
     
    public class threadServeur extends Thread {
     
    	public static Socket client;
    	public static String pseudo;
     
    	public threadServeur(Socket client, String pseudo) {
    		this.client = client;
    		this.pseudo = pseudo;
    	}
     
    	public void run() {
    		try{
    			threadEcriture ecriture = new threadEcriture(client);
    			ecriture.start();
    		while(client.isConnected()) {
    		if(client.getInputStream().available() != -1) {
    		byte[] caracteres = new byte[64000];
    		int caraLu = client.getInputStream().read(caracteres);
    		String aEcrire = new String(caracteres, 0, caraLu);
    		System.out.println(aEcrire);
    		}
    		else {	
    		}
     
    		}
     
    	}catch(Exception e){ e.printStackTrace(); }
    }
    }
     
    class threadEcriture extends Thread {
     
    	public static Socket client;
     
    	public threadEcriture(Socket client) {
    		this.client = client;
    	}
     
    	public void run()  {
    		Scanner sc = new Scanner(System.in);
    		String str;
    		try {
    		BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(client.getOutputStream()));
    		while(client.isConnected()) {
    			str = sc.nextLine();
    			writer.write(str);
    			writer.flush();
    		}
    		}catch(Exception e) { e.printStackTrace(); }
    	}
    }

  14. #14
    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
    Juste un truc, quand tu travaille sur la socket (write ou read), met le dans un bloc synchronized, pour éviter que l'un lise pendant que l'autre écrit.
    De plus ton if (client.getInputStream().available()) n'est plus nécessaire puisque tu a séparé l'écriture de la lecture. Ce n'est donc plus un problème d'avoir une lecture bloquante.

Discussions similaires

  1. Probleme avec la copie des surfaces
    Par Black_Daimond dans le forum DirectX
    Réponses: 3
    Dernier message: 09/01/2003, 10h33
  2. Problèmes avec le filtrage des ip
    Par berry dans le forum Réseau
    Réponses: 9
    Dernier message: 30/12/2002, 07h51
  3. probleme avec la touche F10
    Par b.grellee dans le forum Langage
    Réponses: 2
    Dernier message: 15/09/2002, 22h04
  4. Probleme avec fseek
    Par Bjorn dans le forum C
    Réponses: 5
    Dernier message: 04/08/2002, 07h17
  5. [Kylix] probleme avec un imagelist
    Par NicoLinux dans le forum EDI
    Réponses: 4
    Dernier message: 08/06/2002, 23h06

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