Besoin d'aide pour les sockets UDP
Résolu
delfre56
Messages postés
350
Date d'inscription
Statut
Membre
Dernière intervention
-
delfre56 Messages postés 350 Date d'inscription Statut Membre Dernière intervention -
delfre56 Messages postés 350 Date d'inscription Statut Membre Dernière intervention -
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 :
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 :)
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 :)
A voir également:
- Open udp port in ooredoo algeria
- Open office gratuit - Télécharger - Suite bureautique
- Tcp udp - Guide
- Open core legacy patcher - Accueil - MacOS
- Port ping ✓ - Forum Réseaux sociaux
- Dc in - Forum Audio
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.
Bref, j'ai bien pris note de tes remarques, la prochaine fois je mettrais mon programme serveur aussi :)