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. #1
    Membre régulier
    Client Serveur socket
    Bonjour,
    J'ai un problème pour réaliser une petite application client/serveur utilisant les sockets.
    Pour l'instant mon client envoi un message au serveur mais le serveur ne peut pas lui répondre.
    Comment pourrai-je faire une petite messagerie instantanée simple entre mon serveur et un seul client ?
    Merci d'avance

  2. #2
    Expert éminent sénior
    tu peux etre plus précis sur ton problème? qu'est-ce qui emêche ton serveur de répondre? Quel est ton code, quels sont tes messages d'erreur?
    David Delbecq Java developer chez HMS Industrial Networks AB.    LinkedIn | Google+

  3. #3
    Membre expert
    Une fois que ta connexion est établie avec une Socket par exemple tu as tout le nécéssaire pour envoyer/recevoir avec.


    notamment avec les méthodes getInputStream et getOutputStream.

    http://www.cui.unige.ch/java/JAVAF/S...ketServer.html
    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

  4. #4
    Membre régulier
    En fait mon client peut envoyer un message au serveur et celui ci le reçoit bien. Mais le cas inverse ne fonctionne pas. Cependant ce code fonctionne mais que dans un sens, j'utilise 3 classes :
    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
    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);
    			String str =null;
    			while (true )
    			{
    				str=clavier.readLine();
    				buffer_out.println(str);
    				if (str.equals("$")||str.equals("$$") ) break;
    			}
    			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();
        }
    }


    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();
        }
    }


    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
    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 buffer_in = new BufferedReader(new InputStreamReader(socket.getInputStream()));
        		String str=null;
        		while (true)
        		{
        			str = buffer_in.readLine();
        			if (str.equals("$")) break;
        			System.out.println(numero+":"+str);
        		}
        		System.out.println("Deconnection client "+numero);
        		buffer_in.close();
        		socket.close();
        	}
        	catch(IOException e){}
        }
    }

  5. #5
    Membre expert
    Est ce normal que ton serveur n'ait aucun writer?
    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. #6
    Membre régulier
    C'est peut être pour ça qu'il ne peut pas répondre au client.
    Il faudrait que je rajoute un writer ? Pour que le client reçoive le writer il faudrait que je fasse quoi ?
    Merci

  7. #7
    Membre expert
    Un truc dans le style

    coté service:
    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
     
    versClient = new PrintStream(socket.getOutputStream()
    versClient.println("Coucou !!");


    ensuite coté client il faut aussi lire l'entrée de la socket pour recevoir les informations de ton serveur

    En gros il faut que tu ait une symétrie entre le client et le serveur au niveaux des entrées sorties
    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
     
    Client                            Serveur
    +--------------+        +--------------+
    | OutputStream |------> |InputStream   |
    | InputStream  |<------ |OutputStream  |
    +--------------+        +--------------+
    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

  8. #8
    Membre régulier
    Merci je vais essayer de mettre en place ta solution.

  9. #9
    Membre régulier
    Le versClient je l'ai placé à ce niveau dans ma classe 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
    try
        	{
        		BufferedReader buffer_in = new BufferedReader(new InputStreamReader(socket.getInputStream()));
        		String str=null;
        		PrintStream versClient = new PrintStream(socket.getOutputStream());
        		versClient.println("Coucou");
     
        		while (true)
        		{
        			str = buffer_in.readLine();
        			if (str.equals("$")) break;
        			System.out.println(numero+":"+str);
        		}
        		System.out.println("Deconnection client "+numero);
        		buffer_in.close();
        		socket.close();

    Mais quand je lance mon application le "Coucou" de test n'apparait pas.
    Sinon il faut bien d'après ton schéma que je rajoute un OutputStream et InputStream dans ma classe Serveur puis un InputStream dans ma classe Client ?
    Merci

  10. #10
    Membre expert

    Sinon il faut bien d'après ton schéma que je rajoute un OutputStream et InputStream dans ma classe Serveur puis un InputStream dans ma classe Client ?
    En gros oui.

    Pour résumer:
    Coté serveur tu dois avoir ce genre de chose:
    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
       socket = new ServerSocket(portNumber);
    ...
       client = socket.accept();
    ...
       in = new BufferedReader(new InputStreamReader(client.getInputStream()));
       out = new PrintWriter(client.getOutputStream(), true);


    Coté client cela peux ressembler à:
    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    socket = new Socket(serverName, portNumber);
    out = new PrintWriter(socket.getOutputStream(), true);
    in = new BufferedReader(new inputStreamReader(socket.getInputStream()));
    ...


    Dans les deux cas (client ou serveur), le programme lit dans "in" et tu envois dans "out".

    Il faut aussi faire attention que le numéro de port soit le même sur le client et le serveur.
    Que le nom du serveur lors de la création coté client correspond au nom de la machine sur laquelle tu lance le serveur.
    ....


    Et quand c'est finis:
    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

  11. #11
    Membre régulier
    Merci pour ton aide et toutes tes explications, avec tout ça je devrais y arriver.

  12. #12
    Membre régulier
    Ca fait 2h que je suis dessus et toujours au même stade hélas !
    J'ai testé juste avec 2 classes Client et Serveur mais ça ne fonctionnait pas car en regardant tes dernières explications et les exemples j'ai supprimé la classe Service mais + rien ne marchait, pas de messages d'erreurs mais il ne se passait rien.
    La classe Service est-elle donc toujours nécessaire en vue de tes dernières explications ou inutile ?
    Merci pour ton aide en tout cas

  13. #13
    Membre expert
    Il faut aussi vérifier que le firewall autorise les communications entre ton client et ton serveur.

    peux-tu montrer ton code (la dernière version?)


    La classe Service est-elle donc toujours nécessaire en vue de tes dernières explications ou inutile ?
    Elle ne me semble pas obligatoire pour un simple client serveur pour se former à l'usage des socket.

    Cela peux être abordé dans un second temps si tu souhaite avoir un serveur multi-threadé.
    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

  14. #14
    Membre expert
    Salut,
    je viens de faire quelques modifications du code que tu as donné au debut.
    Avec ce code, quand je tappe hello coté client, le serveur me répond coucou.



    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
    53
    54
     
     
    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();
        }
    }


    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
    42
     
    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 !!!");
                            }
                        }
        		System.out.println("Deconnection client "+numero);
        		in.close();
                    out.close();
        		socket.close();
                }
        	catch(IOException e){}
        }
    }
    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

  15. #15
    Membre régulier
    Salut, je te remercie je vais tester tes modifications.
    Je te laisse ma dernière version du 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
    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
    import java.io.*;
    import java.net.*;
     
    public class Client extends Thread
    {
    	Socket socket =null;
    	int port=5000;
       	PrintWriter out = null;
       	BufferedReader in = null;
    	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");
    			if (ip!=null) socket = new Socket(ip, port);
    			else socket = new Socket(adresse, port);
           			out = new PrintWriter(socket.getOutputStream(), true);
           			in = new BufferedReader(new InputStreamReader(socket.getInputStream()));
    			String str=null;
    			while(true){
    				str=in.readLine();
    				out.println(str);
    				if (str.equals("$")||str.equals("$$") ) break;
    			}
    			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();
        }
    }

    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
    import java.io.*;
    import java.net.*;
     
    public class Serveur extends Thread
    {
    	ServerSocket serveur = null;
        	Socket client = null;
        	int port=5000;
    	BufferedReader entree = null;
    	PrintWriter sortie = null;
    	String texte;
     
        public void run()
        {
        	try
        	{
        		System.out.println("Serveur actif");
        		serveur = new ServerSocket(port);
    		client = serveur.accept();
     
    		entree = new BufferedReader(new InputStreamReader(client.getInputStream()));
          		sortie = new PrintWriter(client.getOutputStream(), true);
     
        		while(true)
        		{
    	    		        texte = entree.readLine();
    				//Envoyer un texte au client
            			sortie.println(texte);
     
        		}
        	}
        	catch(IOException e)
        	{
        		System.out.println("Erreur Serveur");
        	}
       }
     
    	protected void fin(){
    		try{
    			//Nettoyer 
            		entree.close();
            		sortie.close();
            		serveur.close();
    		}
    		catch(IOException e) {
            		System.out.println("Erreur de lecture");
    		}
    	}
     
       public static void main(String[] args)
        {
    	   Serveur leServeur=new Serveur();
    	   leServeur.run();
        }
    }


    Il est possible de faire en sorte que ce soit une discussion entre le serveur et le client ? Car avec tes modifications que je vais regarder de plus près, si j'ai bien compris c'est une réponse automatique généré si le client envoie "Coucou" ?
    Merci encore pour ton aide

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

    Il est possible de faire en sorte que ce soit une discussion entre le serveur et le client ?
    D'un point de vue très simplifié, c'est le même principe qu'une communication entre deux personnes.

    Dans la programmation client/serveur, Tu retrouve classiquement un client qui envois des requêtes"/questions" à un serveur, le serveur effectue une série d'action en rapport avec la requête et retourne le résultat au client sous forme de réponse.

    Pour que ce modèle marche, il est nécessaire que le client et le serveur soient capable de se comprendre (même vocabulaire/grammaire).



    Citation Envoyé par ced56 Voir le message

    Car avec tes modifications que je vais regarder de plus près, si j'ai bien compris c'est une réponse automatique généré si le client envoie "Coucou" ?
    le serveur répond "coucou" si le client envois "hello"
    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

  17. #17
    Membre régulier
    Ok merci, je suis en train de tester le code que tu m'as donné avec Service et j'ai un erreur de compilation de la classe Serveur au niveau de l'utilisation de la classe Service qui est pourtant bien orthographiée. D'où cela peut il venir ?
    Je compile en ligne de commande avec Ubuntu, voilà l'erreur :
    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    src/Serveur.java:22: cannot find symbol
    symbol  : class Service
    location: class mess.Serveur
        			Service service=new Service(numero++,socket);
        			^
    src/Serveur.java:22: cannot find symbol
    symbol  : class Service
    location: class mess.Serveur
        			Service service=new Service(numero++,socket);
        			                    ^
    2 errors

  18. #18
    Membre expert
    As-tu cette ligne dans tes import

    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

  19. #19
    Membre régulier
    Non je ne l'avais pas, j'ai trouvé une autre solution entre temps pour compiler toutes mes classes en même temps mais là l'exécution ne marche pas donc je rajoute cette ligne et ça devrait le faire, merci

  20. #20
    Membre régulier
    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