Besoin d'aide pour les sockets UDP

Résolu/Fermé
delfre56 Messages postés 340 Date d'inscription mardi 3 juillet 2012 Statut Membre Dernière intervention 23 février 2018 - 29 mars 2016 à 18:10
delfre56 Messages postés 340 Date d'inscription mardi 3 juillet 2012 Statut Membre Dernière intervention 23 février 2018 - 31 mars 2016 à 14:45
Bonjour,
je dois réaliser un programme en java qui envoie un datagramme à un serveur pour lui demander des informations sur un élément contenu dans une Hashmap en l'identifiant par un login. Voilà ce que j'ai écrit :

import java.net.*;
import java.util.Date;
import java.nio.charset.Charset;

/**
 * Programme d'envoi de requete a ProcessUserInfo
 */
public class RequestUserInfo {
    /**
     * Programme d'envoi de requete via datagramme
     */
    public static void main (String args[]){
        if (args[0].equals("-h")) {
            System.out.println("usage : java RequestUserInfo adressRecep portRecept adressEmet portEmet login");
        }else{
            // Reccuperation des parametres passes en arguments
            String address1 = args[0];
            int port1 = Integer.parseInt(args[1]);
            short port1S = (short)(port1-50000);
            String address2 = args[2];
            int port2 = Integer.parseInt(args[3]);
            short port2S = (short)(port2-50000);
            String login = args[4];
            
            // datagramme
            Datagram2 dg = new Datagram2(address2,port2S,login);
            
            // Concatenation des champs du datagramme pour les envoyer
            byte[] data = new byte[32];
            data[0] = dg.type;
            DataBufferizer.writeByteArray(dg.address,data,1,4);
            DataBufferizer.writeShort(dg.port,data,6);
            DataBufferizer.writeByteArray(dg.login,data,8,17);
            
            // Tableau pour recevoir les nouvelles donnees
            byte[] dataR = new byte[32];

            // Envoi des donnees
            try{
                // Creation du socket
                
                DatagramSocket socket = new DatagramSocket(port2);
                DatagramPacket packet = new DatagramPacket(data,32,InetAddress.getByName(address1),port1);
                socket.send(packet);
                
                DatagramPacket packetR = new DatagramPacket(dataR,32);
                socket.receive(packetR);
                socket.close();
                receive(dataR);
            }catch (Exception e){
                System.out.println("Erreur lors de l'envoi des données");
            }
        }
    }
    
    /**
     * Methode pour recevoir les donnees
     */
    public static void receive(byte[] data){
        try{
            // Interpretation des donnees recues
            long date = DataBufferizer.readLong(data,1);
            Date d = new Date(date);
            int w = data[9]+128;
            int x = data[10]+128;
            int y = data[11]+128;
            int z = data[12]+128;
            String address = w+"."+x+"."+y+"."+z;
            int port2 = DataBufferizer.readShort(data,13) + 50000;
            int length = data[15];
            byte[] login = new byte[length];
            System.arraycopy(data,16,login,0,length);
            String log = new String( login, Charset.forName("UTF-8") );
            
            // Affichage des données recues
            System.out.println("Date : "+d);
            System.out.println("Addresse (IPv4) : "+address);
            System.out.println("Port "+port2);
            System.out.println("Login : "+log);
        }catch (Exception e){
            System.out.println("Erreur lors de la reception des donnees");
        }
    }
}


Le résultat, c'est que quand j’exécute ce programme dans un terminal, il reste là à tourner sans rien recevoir, alors que le serveur lui me dit qu'il a bien renvoyé une réponse. A priori, le problème ne vient pas de mon serveur, qui fonctionne très bien avec des demandes différentes. J'ai l'impression que c'est mon socket.receive(packetR) qui ne fonctionne pas, mais après moult recherches sur les internets, je ne vois pas comment écrire ça autrement. Je m'en remet donc à vous, Ô grands génies du forum :)

1 réponse

KX Messages postés 16753 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 25 novembre 2024 3 019
29 mars 2016 à 19:58
Bonjour,

Normalement pour une communication client/serveur il faut un client et un serveur donc deux méthodes main que tu lances dans deux consoles différentes, l'une communiquant avec l'autre, il t'en manque donc la moitié.
0
delfre56 Messages postés 340 Date d'inscription mardi 3 juillet 2012 Statut Membre Dernière intervention 23 février 2018 48
30 mars 2016 à 13:16
Bonjour, et merci pour ta réponse.
Nan, je le précise dans ma question, j'ai bien un programme serveur. Juste que je trouvais ça un peu trop de le mettre aussi dans la question. Surtout que je suis presque sûr que lui il fonctionne. Dans le cas où il communique avec la méthode main ci-dessus, il reçoit un datagramme contenant simplement un login sous la forme d'un tableau de bytes, et il doit renvoyer un datagramme plus fourni contenant des informations supplémentaires liées à ce login. Et c'est la réception de ce deuxième datagramme qui ne fonctionne pas.
0
KX Messages postés 16753 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 25 novembre 2024 3 019
30 mars 2016 à 20:23
Pour t'aider le mieux c'est de pouvoir tester et donc d'avoir le code du serveur aussi, sinon je dois soit recoder moi même un serveur pour tester (mais j'ai pas envie ^^) soit me limiter à la lecture du code qui mais je t'avouerais que les Datagram ça fait un moment que je n'ai pas eu d'exercice dessus (dans la vraie vie, tu feras jamais ça...)
0
delfre56 Messages postés 340 Date d'inscription mardi 3 juillet 2012 Statut Membre Dernière intervention 23 février 2018 48 > KX Messages postés 16753 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 25 novembre 2024
31 mars 2016 à 14:45
Merci, mais j'ai fini par trouver mon erreur ! Il s'agissait juste d'un indice dans un tableau que j'avais mal compté...
Bref, j'ai bien pris note de tes remarques, la prochaine fois je mettrais mon programme serveur aussi :)
0