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 :

Client Serveur socket


Sujet :

Entrée/Sortie Java

  1. #21
    Membre expert
    Citation Envoyé par ced56 Voir le message
    Je viens de tester ton code avec le client j'envoie bien hello, il se passe quelque chose du côté du serveur, il met Envoi de Coucou cependant la console Client n'affiche pas Coucou :s
    pb de firewall?
    bazar: http://www.improetcompagnie.com/publ...ctacles-6.html

    BÉPO la disposition de clavier francophone, ergonomique et libre: http://bepo.fr/wiki/Accueil

    Emacs Wiki: http://www.emacswiki.org/

    En attente de ce que produira: http://www.pushmid.com

  2. #22
    Membre expert
    A j'allais oublier la socket telle que tu l'utilise est bloquante.

    donc ton programme se bloque sur le readLine tant que tu ne fournit pas quelque chose de l'autre coté.

    En reprenant le code de Service.java que je t'avais fournit plus haut et en modifiant la boucle comme suit:
    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    while (true) {
      str = in.readLine();
      if (str.equals("$")) break;
        System.out.println(numero+":"+str);
        if (str.equals("hello")) {
          System.out.println("Envoi de coucou");
          out.println("Couou !!!");
         } else {
           out.println(str);
         }
    }

    ton programme ne devrais plus se coincer.

    La vrai solution pour pallier au problème de blocage sur le readLine est d'utiliser des socket non bloquant.
    http://humbert-florent.developpez.co...vance/#LIV-D-1
    bazar: http://www.improetcompagnie.com/publ...ctacles-6.html

    BÉPO la disposition de clavier francophone, ergonomique et libre: http://bepo.fr/wiki/Accueil

    Emacs Wiki: http://www.emacswiki.org/

    En attente de ce que produira: http://www.pushmid.com

  3. #23
    Membre régulier
    Merci je teste avec le nouveau code puis je regarde les sockets non bloquants de plus près.
    Juste une dernière question qui est en fait le centre du problème, est-ce qu'il est possible de mettre en place simplement en remplaçant à ce niveau là :
    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
        if (str.equals("hello")) {
          System.out.println("Envoi de coucou");
          out.println("Couou !!!");


    Remplacer le hello par n'importe quelle chaîne de caractère et le Coucou envoyé par une saisie clavier ?

    Merci d'avance

    Edit : J'ai testé ton code ça ne marchait pas par contre j'ai démarré Service dans ma classe Client à ce niveau là :
    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    while (true )
    			{
    				str=clavier.readLine();
    				buffer_out.println(str);
    				if (str.equals("$")||str.equals("$$") ) break;
    				Service service=new Service(numero,socket);
        			        service.start();
    			}

    Et ça fonctionne le Coucou est envoyé

  4. #24
    Membre expert
    Citation Envoyé par ced56 Voir le message
    Merci je teste avec le nouveau code puis je regarde les sockets non bloquants de plus près.
    Juste une dernière question qui est en fait le centre du problème, est-ce qu'il est possible de mettre en place simplement en remplaçant à ce niveau là :
    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
        if (str.equals("hello")) {
          System.out.println("Envoi de coucou");
          out.println("Couou !!!");


    Remplacer le hello par n'importe quelle chaîne de caractère et le Coucou envoyé par une saisie clavier ?
    Oui, il suffit juste d'implémenter la saisie clavier comme tu l'as faite pour le client.
    bazar: http://www.improetcompagnie.com/publ...ctacles-6.html

    BÉPO la disposition de clavier francophone, ergonomique et libre: http://bepo.fr/wiki/Accueil

    Emacs Wiki: http://www.emacswiki.org/

    En attente de ce que produira: http://www.pushmid.com

  5. #25
    Membre expert
    Citation Envoyé par ced56 Voir le message

    Edit : J'ai testé ton code ça ne marchait pas

    Il marche chez moi.
    Service
    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
    package mess;
    import java.io.*;
    import java.net.*;
     
    public class Service extends Thread
    {
        private  Socket socket;
        private int numero;
     
        public Service(int numero,Socket socket)
        {
        	this.numero=numero;
        	this.socket=socket;
        }
     
        public void run()
        {
        	try
                {
        		BufferedReader in = new BufferedReader(new InputStreamReader(socket.getInputStream()));
                    PrintWriter out = new PrintWriter(socket.getOutputStream(), true);
                    String str=null;
        		while (true) {
        			str = in.readLine();
        			if (str.equals("$")) break;
        			System.out.println(numero+":"+str);
                            if (str.equals("hello")) {
                                System.out.println("Envoi de coucou");
                                out.println("Couou !!!");
                            } else {
                                out.println(str);
                            }
                        }
        		System.out.println("Deconnection client "+numero);
        		in.close();
                    out.close();
        		socket.close();
                }
        	catch(IOException e){}
        }
    }

    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
    30
    31
    32
    33
    34
    35
    36
    37
    38
    package mess;
     
    import java.io.*;
    import java.net.*;
     
    public class Serveur extends Thread
    {
        ServerSocket serveur=null;
        Socket socket=null;
        int port=5000;
        int numero=1;
     
        public void run()
        {
        	try
        	{
        		System.out.println("Serveur actif");
        		serveur = new ServerSocket(port);
        		while(true)
        		{
                        socket=serveur.accept();
                        System.out.println("Connection client "+ numero +" "+socket);
                        Service service=new Service(numero++,socket);
                        service.start();
        		}
        	}
        	catch(IOException e)
        	{
        		System.out.println("Erreur Serveur");
        	}
       }
     
       public static void main(String[] args)
        {
    	   Serveur leServeur=new Serveur();
    	   leServeur.start();
        }
    }


    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
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    import java.io.*;
    import java.net.*;
     
    public class Client extends Thread
    {
        Socket socket =null;
        int port=5000;
        String adresse=null;
        InetAddress ip=null;
     
        public Client(InetAddress a){ip=a;}
        public Client(String s){adresse=s;}
     
        public void run()
        {
            try
                {
                    System.out.println("Client actif");
                    Reader reader= new InputStreamReader(System.in);
                    BufferedReader clavier=new BufferedReader(reader);
                    if (ip!=null) socket = new Socket(ip, port);
                    else socket = new Socket(adresse, port);
                    System.out.println("SOCKET = " + socket);
                    PrintWriter buffer_out = new PrintWriter(new BufferedWriter(new OutputStreamWriter(socket.getOutputStream())),true);
                    BufferedReader in = new BufferedReader(new InputStreamReader(socket.getInputStream()));
                    String str =null;
                    while (true )
                        {
                            str=clavier.readLine();
                            buffer_out.println(str);
                            if (str.equals("$")||str.equals("$$") ) break;
                            str=in.readLine();
                            if (str != null) {
                                System.out.println("lecture de " + str);
                            }
                        }
                    in.close();
                    buffer_out.close();
                    socket.close();
                }
            catch(IOException e)
                {
                    System.out.println("Erreur client");
                }
        }
     
        public static void main(String[] args)
        {
            Client client=new Client("127.0.0.1");
            client.start();
        }
    }

    Citation Envoyé par ced56 Voir le message

    par contre j'ai démarré Service dans ma classe Client à ce niveau là :
    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    while (true )
    			{
    				str=clavier.readLine();
    				buffer_out.println(str);
    				if (str.equals("$")||str.equals("$$") ) break;
    				Service service=new Service(numero,socket);
        			        service.start();
    			}

    Et ça fonctionne le Coucou est envoyé
    Pourquoi, mettre le service dans le client, tu compte te connecter à plusieurs serveur en même temps, dans ce cas ou compte tu envoyer la saisie clavier?
    bazar: http://www.improetcompagnie.com/publ...ctacles-6.html

    BÉPO la disposition de clavier francophone, ergonomique et libre: http://bepo.fr/wiki/Accueil

    Emacs Wiki: http://www.emacswiki.org/

    En attente de ce que produira: http://www.pushmid.com

  6. #26
    Membre régulier
    Merci pour ta nouvelle réponse.
    J'ai mis le Service dans Client car sinon j'avais une boucle infinie qui envoyait le Coucou et en agissant ainsi il n'envoyait qu'une seule fois donc une connexion à un seul serveur suffira largement.
    Je vais essayé ton code et sinon pour la saisie clavier je crois voir ce qu'il faut faire

    Edit : J'ai utilisé ton code et c'est fonctionnel, il me reste plus qu'à trouver un moyen de remplacer le hello par n'importe quelle String puis le Coucou par une saisie clavier (en utilisant la méthode que j'ai utilisé dans Client)

  7. #27
    Membre régulier
    J'ai réussi à tout mettre place encore merci pour ton aide !
    Cependant je viens de me rendre compte que ni le serveur ni le client ne peut envoyer 2 phrases à la suite car sinon il y a un décalage dans la réception des messages.
    Est-ce qu'il est possible de supprimer ce décalage ?