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 UDP client/serveur


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 socket UDP client/serveur
    Bonjour je ne trouvais pas de rubrique ou poster, alors je poste ici.
    Je viens de debuter dans la programmation reseau, et j'ai fait mes premiers sockets(client/serveur) via un protocole UDP.
    Mais ca ne marche pas. Les 2sont sur la meme machine sa vient peut etre de la. 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
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    import java.net.*;
    import java.io.*;
     
     
    public class serveurUDP {
     
    	static int taille = 1024;
    	static byte[] tampon = new byte[taille];
    	static int port = 9332;
     
    	public static void main(String[] args)throws Exception {
    		DatagramSocket socket = new DatagramSocket(port);
    		String donne = "";
    		String message = "";
    		taille = 0;
    		System.out.println("serveur initialisé");
    		while(true) {
    		DatagramPacket paquet = new DatagramPacket(tampon, tampon.length);
    		socket.receive(paquet);
    		System.out.println("paquet recu de la part de: "+ paquet.getAddress());
    		taille = paquet.getLength();
    		 donne = new String(paquet.getData(),0, taille);
    		message = "bonjour"+donne;
    		System.out.println("les données qui seront envoyées sont: "+ message);
    		DatagramPacket envoie = new DatagramPacket(message.getBytes(), message.length(), paquet.getAddress(), paquet.getPort());
    		socket.send(envoie);
    		}
     
    	}
     
    }
    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
    import java.net.*;
     
    public class client {
     
    	static int port = 9332;
    	static int taille = 1024;
    	static byte[] tampon = new byte[taille];
     
    	public static void main(String[] args)throws Exception {
    		InetAddress serveur = InetAddress.getLocalHost();
    		DatagramSocket socket = new DatagramSocket(port);
    		String message = "yoann";
    		DatagramPacket donneEnvoye = new DatagramPacket(message.getBytes(), message.length(), serveur, port);
    		socket.send(donneEnvoye);
    		DatagramPacket donneRecu = new DatagramPacket(tampon, tampon.length);
    		socket.receive(donneRecu);
    		String texte = new String(donneRecu.getData(), 0, tampon.length);
    		System.out.println(texte);
     
    	}
     
    }
    et messages d'erreur:
    Exception in thread "main" java.net.BindException: Address already in use: Cannot bind
    at java.net.PlainDatagramSocketImpl.bind0(Native Method)
    at java.net.PlainDatagramSocketImpl.bind(PlainDatagramSocketImpl.java:82)
    at java.net.DatagramSocket.bind(DatagramSocket.java:368)
    at java.net.DatagramSocket.<init>(DatagramSocket.java:210)
    at java.net.DatagramSocket.<init>(DatagramSocket.java:261)
    at java.net.DatagramSocket.<init>(DatagramSocket.java:234)
    at serveurUDP.main(serveurUDP.java:12)


    Comme vous pouvez le voir, c'est un truc tout con et tres basique, mais bon je debute.

  2. #2
    Membre averti
    Inscrit en
    Octobre 2007
    Messages
    311
    Détails du profil
    Informations forums :
    Inscription : Octobre 2007
    Messages : 311
    Points : 318
    Points
    318
    Par défaut
    Salut,

    Comme te l'annonce l'exception, le port est déjà utilisé. En effet, tu crées une DatagramSocket dans le main de ton client avec ce port (9332 si je ne m'abuse) mais aussi dans le main de ton serveur. Puisque tu es sur le même PC, cela lève une exception.

    Ton client n'a pas besoin de port pour créer sa socket. C'est ce que tu vas spécifier au DatagramPacket qui va faire qu'il va s'adresser au serveur comme il faut (il te faut cependant connaitre le port d'écoute de ton serveur).

    EDIT : de plus, je te conseille, lors de la récup des données, de faire un donneRecu.getLength() plutôt que te baser sur la taille du tampon (si jamais la taille des données reçues est inférieure à 1024 octets, tu risques d'afficher des caractères n'ayant rien à voir avec tes données).

  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 de ta reponse. Si j'ai bien compri, lors dela creation de mon socket client, il ne faut pas que je precise de port?


    Sinon autre question qui n'a rien à voir. On m'a dit qu'il fallait mieux essayer(ou commencer) par le protocole TCP, c'est donc ce que j'ai fait. Je suis allé sur un tuto qui explique tres bien, mais je n'ai pas compris un de leur code.
    Voici le 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
    package developpez;
     
    import java.io.BufferedReader;
    import java.io.IOException;
    import java.io.InputStreamReader;
    import java.net.ServerSocket;
    import java.net.Socket;
     
    /**
     * @author millie
     * 
     */
    public class TestInetAddress {
     
    	/**
             * @param args
             * @throws IOException
             * @throws UnknownHostException
             * @throws SocketException
             */
    	public static void main(String[] args) throws IOException {
    		ServerSocket server = new ServerSocket(300);
    		Socket client = server.accept();
    		BufferedReader reader = new BufferedReader(new InputStreamReader(client
    				.getInputStream()));
    		String ligne;
     
    		try {
    			while ((ligne = reader.readLine()) != null) {
    				System.out.println(ligne);
    			}
    		} catch (Exception e) {
    			e.printStackTrace();
    		} finally {
    			reader.close();
    			client.close();
    			server.close();
     
    		}
     
    	}
     
    }
    Il me met que reader lit des ligne, mais quelles lignes, des lignes qui viennent d'ou?
    Ensuite il met met de taper des commandes pour que ca marche. Mais avec mon code UDP ce n'etait pas du tout la meme chose.

    ET enfin, je ne comprends pas cette ligne
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    BufferedReader reader = new BufferedReader(new InputStreamReader(client
    				.getInputStream()));
    Quelqu'un pourrait il me l'expliquer?

    MErci d'avance

  4. #4
    Membre averti
    Inscrit en
    Octobre 2007
    Messages
    311
    Détails du profil
    Informations forums :
    Inscription : Octobre 2007
    Messages : 311
    Points : 318
    Points
    318
    Par défaut
    Citation Envoyé par xokami35x Voir le message
    Si j'ai bien compri, lors dela creation de mon socket client, il ne faut pas que je precise de port?
    C'est bien ça. Le port de connexion distant est précisé dans le constructeur du DatagramPacket.

    Citation Envoyé par xokami35x Voir le message
    Il me met que reader lit des ligne, mais quelles lignes, des lignes qui viennent d'ou?
    Ce sont les infos qui proviennent de ta socket cliente !

    Citation Envoyé par xokami35x Voir le message
    Ensuite il met met de taper des commandes pour que ca marche. Mais avec mon code UDP ce n'etait pas du tout la meme chose.
    La différence entre les sockets UDP et TCP sont le mode de connexion ("connecté" pour le TCP, "Déconnecté" pour l'UDP).

    Si tu cherches un tant soit peu sur le net, tu pourras trouver des infos telles que :
    Citation Envoyé par un mec sur un site trouvé via Google
    * Le mode connecté (comparable à une communication téléphonique), utilisant le protocole TCP. Dans ce mode de communication, une connexion durable est établie entre les deux processus, de telle façon que l'adresse de destination n'est pas nécessaire à chaque envoi de données.
    * Le mode non connecté (analogue à une communication par courrier), utilisant le protocole UDP. Ce mode nécessite l'adresse de destination à chaque envoi, et aucun accusé de réception n'est donné.
    Citation Envoyé par xokami35x Voir le message
    ET enfin, je ne comprends pas cette ligne
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    BufferedReader reader = new BufferedReader(new InputStreamReader(client.getInputStream()));
    Tu récupères le flux de données qui arrivent du client (client.getInputStream()). Pour lire ce flux, tu utilises un objet Java "lecteur de flux" (InputStreamReader) et tu le donnes à un objet qui te permet d'en lire le contenu facilement (BufferedReader).

  5. #5
    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
    Alors la super, merci beaucoup.
    Niveau TCP ou UDP c'est encore un peu flou mais c'est mieux.
    Sinon pour le buffer merci la je vois ce que c'est.
    Pour la classe serveur, j'avais pas compris que ce n'etait que le serveur^^
    Enfin t'as vraiment bien repondu, merci beaucoup.
    (je trouve tout de meme le UDP, plus simple que le TCP, meme si je sais que c'est moins fiable mais plus rapide)

    edit: petite question, j'ai fait mons erveur TCP tout con, mais j'aimerai renvoyer une ligne au client, j'utilise donc:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(client.getOutputStream()));
    Mais apres, quand je fait
    writer.write(message.getBytes())
    il marche pas.
    Y'a t il une autre methode pour envoyer un string a un client?

  6. #6
    Rédacteur

    Avatar de millie
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    7 015
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 7 015
    Points : 9 818
    Points
    9 818
    Par défaut
    Citation Envoyé par xokami35x Voir le message
    Alors la super, merci beaucoup.
    Niveau TCP ou UDP c'est encore un peu flou mais c'est mieux.
    Sinon pour le buffer merci la je vois ce que c'est.
    Pour la classe serveur, j'avais pas compris que ce n'etait que le serveur^^
    Enfin t'as vraiment bien repondu, merci beaucoup.
    (je trouve tout de meme le UDP, plus simple que le TCP, meme si je sais que c'est moins fiable mais plus rapide)

    edit: petite question, j'ai fait mons erveur TCP tout con, mais j'aimerai renvoyer une ligne au client, j'utilise donc:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(client.getOutputStream()));
    Mais apres, quand je fait
    writer.write(message.getBytes())
    il marche pas.
    Y'a t il une autre methode pour envoyer un string a un client?
    Comme le flux est bufferisé, il faut appeler writer.flush().

    Et tu peux utiliser directement des String writer.write("Machaine") directement au lieu de passer par des bytes
    Je ne répondrai à aucune question technique en privé

  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 ta reponse. Le flush n'est donc pas au bon endroit.
    Sinon, je me lance dans un petit projet avec le reseau et il me faudrait 2/3 petites precisions:
    Comment faire pour qu'une variable INetAddress, prennent la valeur de l'ip d'un pc sur internet(exemple, je fais uns erveur, un de vous fait un client pour se connecter a ce serveur, qu'allez vous mettre dans InetADdress?)

    Et existe t il une methode pour envoyer/recevoir des fichier/dossiers?
    Si oui laquelle(avec un exemple d'utilisation silvouplait^^)?

    Merci d'avance

    edit: meme avec le flush, ca ne marche toujours pas, voici le 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
    import java.net.*;
    import java.io.*;
     
    public class clientTcp {
     
    	public static void main(String[] args)throws Exception {
    		InetAddress ip = InetAddress.getLocalHost();
    		int port = 9333;
    		Socket client = new  Socket(ip, port);
    		BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(client.getOutputStream()));
    		String donneEnvoye = "yoann";
    		writer.write(donneEnvoye);
    		writer.flush();
    		BufferedReader reader = new BufferedReader(new InputStreamReader(client.getInputStream()));
    		String donneLu = null;
    		while((donneLu = reader.readLine()) != null)
    		System.out.println(donneLu);
     
    		writer.close();
    		reader.close();
    	}
     
     
    }
    Voila, je crois que le client n'envoie rien du tout.

  8. #8
    Futur Membre du Club
    Profil pro
    Inscrit en
    Août 2006
    Messages
    14
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 14
    Points : 9
    Points
    9
    Par défaut
    Citation Envoyé par xokami35x Voir le message
    Ok merci beaucoup de ta reponse. Le flush n'est donc pas au bon endroit.
    Sinon, je me lance dans un petit projet avec le reseau et il me faudrait 2/3 petites precisions:
    Comment faire pour qu'une variable INetAddress, prennent la valeur de l'ip d'un pc sur internet(exemple, je fais uns erveur, un de vous fait un client pour se connecter a ce serveur, qu'allez vous mettre dans InetADdress?)
    Bah, tu dois donner l'ip de ton serveur aux gens qui veulent s'y connecter, ou alors tu as un nom de domaine (DNS => en gros, un nom associé à une ip). Sachant que l'ip c'est bien, mais c'est pas suffisant pour se connecter à un serveur, le client doit savoir aussi sur quel port se connecter (et avec quel protocole, TCP ou UDP). A partir de là le client va utiliser une InetSocketAddress (qui contient une InetAddress).
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    InetSocketAddress insa = new InetSocketAddress(String ip, int port);
    Citation Envoyé par xokami35x Voir le message
    Et existe t il une methode pour envoyer/recevoir des fichier/dossiers?
    Si oui laquelle(avec un exemple d'utilisation silvouplait^^)?
    Pour les dossiers, non pas que je sache, mais en même temps transférer un dossier ça n'a pas beaucoup de sens, vu que ça n'est qu'un conteneur pour des fichiers.
    Pour les fichiers non plus, il n'y a pas de méthode toute faite, mais on s'en sort assez bien.
    L'idée étant qu'un fichier n'est jamais qu'un gros paquet de bytes, donc avec un FileInputStream tu t'en sors.

    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
     public static void main(String[] args) {
            try {
                FileInputStream reader = new FileInputStream(new File("fichier_a_envoyer"));
                // Le reader va lire le fichier et remplir le tampon
                byte [] buffer = new byte[1024];
                String ip_server=args[0]; // L'ip du serveur auquel on se connecte
                int port_server = Integer.parseInt(args[1]); // Le port sur lequel on se connecte
                Socket s = new Socket(); // La socket de connexion, initialisée mais vide
                // On dit à la socket où se connecter, et on lui donne 5 secondes(5000 millisecondes) pour le faire
                //Si elle n'y arrive pas il y a un lancement d'exception "je sais plus quoi", à toi de regarder dans la doc
                s.connect(new InetSocketAddress(ip_server, port_server),5000);
                int octets_lus=-1;
                OutputStream vers_le_serveur = s.getOutputStream();// On récupère le flux de sortie vers le serveur
                System.out.println("Commence à envoyer le fichier");
                // Tant que le reader arrive à lire des octets adns le fichier (et donc à remplir le buffer)
                // on stocke le nombre d'octets lu et on envoie ces octets vers le serveur
                // le 0 dans l'appel à write est l'offset (décalage) à partir duquel write va commencer à lire le 
                // buffer pour envoyer son contenu
                // Vu que moi je remplis le buffer à partir du début, je l'envoi à partir du début aussi
                // par contre, j'envoie 'octets_lus' octets, parce que si il ne reste plus grand chose à lire dans le fichier,
                // le buffer ne va pas être plein, et je ne veux envoyer que ce que je viens de lire
                // pas les restes de la lecture précédente
                while((octets_lus=reader.read(buffer))>0){// read retourne le nombre d'octets lus
                    vers_le_serveur.write(buffer,0,octets_lus);
                }
                vers_le_serveur.flush(); 
                // Normalement inutile, vu que le outputstream n'est pas bufferisé, mais bon dans le doute ...
                System.out.println("Fichier envoyé");
            } catch (Exception e) {
                e.printStackTrace();
                System.out.println("L'univers s'écroule : /");
                System.exit(1);
            }
        }

    Concernant le code que tu donnes, c'est un peu normal que ça ne marche pas car tu ne contrôles pas la socket qui reçoit la connexion que tu fais. Il te faut une ServerSocket pour ça (et surtout deux programmes différent, un qui envoie, l'autre qui reçoit).

    Sans vouloir, te froisser, ce qu'il te faut à mon avis c'est quelques heures de lecture de tutos sur TCP, UDP, les sockets et serversockets ... Il y en a plusieurs sur developpez.com

  9. #9
    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, le InetSocketAddress va beaucoup m'aider.

    Sinon, non tu ne me froisses pas du tout, j'ai pourtant lu euqlues tuto, mais j'arrive mieux et je comprends mieux l'u UDP que le TCP.
    Sinon je vais suivre ton conseil, je vais chercher d'autres tuto sur le TCP.

    edit: j'ai bien le socket qui controle (le serveur), juste que je ne l'ai pas mis, le voici:

    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
    import java.net.*;
    import java.io.*;
     
     
    public class serveurTCP {
     
    	static int port = 9333;
     
    	public static void main(String[] args)throws Exception {
     
    			ServerSocket serveur = new ServerSocket(port); //initialisation du serveur sur l'adresse local et sur le port 9333
    			Socket client = serveur.accept(); //on accepte le prochain client qui essaye de se connecter
    			String ligne;
    			try {
    				// on cré reader, le buffer qui se cre a partir de l'objet inputstreamreader et qui recupere le flux du client
    				BufferedReader reader = new BufferedReader(new InputStreamReader(client.getInputStream()));
    				//la on recupere le flux d'ecriture vers le client
    				BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(client.getOutputStream()));
    				String message = "votre ligne a bien ete lu par le serveur";
    				writer.write(message);
    				while((ligne = reader.readLine()) != null)
    					System.out.println(ligne);
    				writer.flush();
    				writer.close();
    				reader.close();
     
    		}catch(Exception e) {
    			System.out.println("fatal error");
    			e.printStackTrace();
    		}
    	}
     
     
    }
    Encore merci

Discussions similaires

  1. Problème UDP Client/Serveur : Reception impossible.
    Par qhardy dans le forum Entrée/Sortie
    Réponses: 0
    Dernier message: 01/03/2009, 17h50
  2. UDP client / serveur "retardé"
    Par debutanteVB.NET dans le forum Débuter avec Java
    Réponses: 2
    Dernier message: 17/06/2008, 11h17
  3. socket ipv6 (client/serveur)
    Par beLz dans le forum Réseau
    Réponses: 19
    Dernier message: 07/03/2007, 09h34
  4. [SOCKET] connexion client serveur avec applet
    Par kaiser2003 dans le forum Applets
    Réponses: 2
    Dernier message: 06/10/2004, 22h32
  5. [Routeur/Socket] Connection Client/Serveur
    Par Clorish dans le forum Développement
    Réponses: 3
    Dernier message: 17/12/2003, 13h45

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