Client UDP en Java

Résolu/Fermé
Jo - 1 juin 2014 à 14:57
 Jo - 6 juin 2014 à 08:35
Bonjour,
Je suis une jeune étudiante en prépa, et pour un projet d'informatique, je dois développer un petit programme qui doit communiquer en UDP avec une serre pour lui envoyer des commandes telles que : "ouvre les fenêtres", "arrose", etc ..
Mon prof m'a fournit la platine électronique déjà toute programmée, il ne me reste "plus qu'à" créer un client JAVA pour communiquer avec.

Le protocole est le suivant : je lui envoie une chaîne de caractère en ASCII et elle me retourne la réponse en ASCII également.
Exemple : j'envoie "getT", elle me retourne "Th182" (càd la température est de 18.2 degrés)
J'ai testé avec le logiciel Network stuff et tout fonctionne parfaitement, la serre exécute bien mes ordres et me retourne bien ce qu'il faut !

Le problème arrive quand il faut coder tout cela en Java ! J'ai jamais eu de cours sur le réseau en Java donc je me suis renseignée et je suis tombée sur tout ce qui est DatagramSocket, DatagramPacket, etc, je pense avoir à peu près compris !

J'ai donc essayé de modifier un code trouvé dans la base de données de mon établissement pour qu'il envoie quelque chose en ASCII et récupère la réponse mais ça ne marche pas T.T Je pense qu'il n'y a pas de problème au niveau de la traduction de ma chaîne de caractère en bytes, j'obtiens bien ce que je veux, par contre ma serre ne reçoit jamais ce que je lui envoie (et donc ne me retourne jamais rien), par exemple si je lui demande d'allumer la lumière rien ne se passe ..

Je vous mets mon code ci-dessus, peut être est-ce une erreur toute simple qui sait :) si l'un de vous pouvait éclairer ma lanterne je lui en serais grandement reconnaissante !!
J'exécute ce code en ligne de commande en entrant en paramètres l'adresse IP et le port, je vous transmet après le code ce que j'obtient !!

Merci beaucoup !


import java.io.*;

import java.net.*;


public class clientSerre2 {
public static void main(String[] args) {
try {
// Mise en place du socket d'accès réseau
DatagramSocket socket = new DatagramSocket();

// Définition des données d'identification du serveur
int port = Integer.parseInt(args[1]);
String IP=args[0];
InetAddress address=InetAddress.getByName(IP);



// Structure de donnée de réception et émission
final int MTU = 1500; // MTU = Maximum Transmission Unit : taille max prévue par les protocoles Wifi et Ethernet
DatagramPacket packet;


// Initialisation de la connexion et ouverture des flux d'entrée / sortie.
BufferedReader userInput = new BufferedReader(new InputStreamReader(System.in));

while (true) {
// Lecture bloquante d'une ligne en invite ligne de commande
System.out.println("Entrez un message SVP : ");
String theLine = userInput.readLine();
if (theLine.equals(".")) break;
theLine = theLine + "\r\n";
byte[] data = theLine.getBytes("ASCII");
// émission vers le serveur de la valeur saisie
System.out.println("Send : ");
afficheData(data,data.length);
packet= new DatagramPacket(data, data.length, address, port);
socket.send(packet);

// Lecture bloquante d'un octet sur le réseau et affichage de la valeur reçue.
data = new byte[MTU];

packet= new DatagramPacket(data, MTU);

socket.receive(packet);

System.out.println("Received "+packet.getLength()+" bytes from "+packet.getAddress()+":"+packet.getPort());
afficheData(data,packet.getLength());
System.out.println();
}

// Traitement bien moche des différents cas d'erreur.
} catch (Exception e){
System.out.println("Erreur.");
e.printStackTrace();
}
}


static void afficheData(byte[] data, int length){
if(length==0) {
System.out.println(" {}");
} else {
System.out.print(" {");
for(int i=0 ; i<length-1 ; i++){
System.out.print(data[i]+", ");
}
System.out.println(data[length-1]+"}");
}
}
}

Et voilà ce que j'obtiens :


<C\ .....>java clientSerre2 192.168.0.21 5000
Entrez un message SVP :
getT
Send : {103,101,116,84,13,10}


A voir également:

3 réponses

KX Messages postés 16733 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 31 janvier 2024 3 015
Modifié par KX le 1/06/2014 à 20:23
Bonjour,

Je n'ai pas le code du serveur car j'imagine que ce n'est pas toi qui le gère, cependant je suis sceptique quant à l'utilisation du "\r\n" en fin de ligne à envoyer. As tu essayé avec "\n" tout court, voire sans rien du tout ?

De plus, sans être expert en UDP, je pense qu'il est préférable de préciser l'adresse IP et le port à la socket (au lieu du packet), si ça ne devrait pas changer grand chose pour l'envoi, ça me paraît plus cohérent pour la réception.

Et est-ce qu'un mode connecté ne pourrait pas régler le problème ?

Ton code un peu modifié (je n'ai pas testé)

import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
import java.util.Arrays;
import java.util.Scanner;

public class clientSerre2 
{
    // Structure de donnée de réception et émission
    private static final int MTU = 1500; // MTU = Maximum Transmission Unit : taille max prévue par les protocoles Wifi et Ethernet
    
    private static final Scanner USER_INPUT = new Scanner(System.in);
    
    public static void main(String[] args) throws Exception // Traitement bien moche des différents cas d'erreur.
    {
        // Définition des données d'identification du serveur
        
        String ip = args[0];        
        int port = Integer.parseInt(args[1]);

        InetAddress address = InetAddress.getByName(ip);
        
        DatagramSocket socket = new DatagramSocket(port, address);
        
        while (true)
        {
            // SAISIE
            
            System.out.println("Message (stop with .) : ");
            
            String inputLine = USER_INPUT.nextLine();
            
            if (inputLine.equals("."))
                break;
            
            inputLine += "\r\n"; // ?
            
            byte[] dataToSend = inputLine.getBytes("ASCII");
            
            // REQUETE
            
            System.out.println("Send : "+Arrays.toString(dataToSend));
            
            socket.send(new DatagramPacket(dataToSend, dataToSend.length));
            
            // REPONSE
            
            byte[] dataToReceive = new byte[MTU];

            DatagramPacket packet = new DatagramPacket(dataToReceive, dataToReceive.length);

            socket.receive(packet);

            // AFFICHAGE
            
            System.out.println("Received " + packet.getLength() + " bytes from " + packet.getAddress() + ":" + packet.getPort());
            System.out.println(Arrays.toString(Arrays.copyOf(dataToReceive, packet.getLength())));
        }
        
        // Penser à fermer les flux
        
        socket.close();
    }
}

La confiance n'exclut pas le contrôle
0
Bonjour !
Tout d'abord merci pour votre réponse !

Concernant le \r\n, mon prof m'a bien précisé que je devais le mettre. J'ai tout de même testé sans et ça n'a rien donné non plus.

Je testerai votre code mercredi soir (pas accès à la platine d'ici là) et je reviendrai vers vous pour vous dire si ça marche (ou pas ...)

Pour ce qui est du mode connecté, je vois à peu près ce que c'est, mais pour coder ça en Java .. aucune idée ! Je reprécise que je n'ai aucune formation sur tout ce qui est réseau ! les notions de socket, packet, etc m'étaient encore inconnues il y a quelques semaines ^^ mes cours de Java se limitent aux bases de l'orienté objet (héritage, listes/chaines et un peu d'événementiel et d'interfaces graphiques ...)

en tout cas encore merci, je reviens vers vous d'ici peu !
0
Bonjour,

En fait, mon code marchait : je l'ai essayé sur le réseau de mon école et aucun problème !
J'imagine donc que le problème venait de mon réseau "domestique".

Encore merci beaucoup,
Je marque le sujet comme résolu.
0