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

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Mai 2008
    Messages
    213
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2008
    Messages : 213
    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 expérimenté
    Inscrit en
    Octobre 2007
    Messages
    311
    Détails du profil
    Informations forums :
    Inscription : Octobre 2007
    Messages : 311
    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 confirmé
    Profil pro
    Inscrit en
    Mai 2008
    Messages
    213
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2008
    Messages : 213
    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 expérimenté
    Inscrit en
    Octobre 2007
    Messages
    311
    Détails du profil
    Informations forums :
    Inscription : Octobre 2007
    Messages : 311
    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 confirmé
    Profil pro
    Inscrit en
    Mai 2008
    Messages
    213
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2008
    Messages : 213
    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
    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

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