Programmation Client/Serveur UDP

Résolu
most27 Messages postés 74 Date d'inscription mardi 29 octobre 2013 Statut Membre Dernière intervention 9 juillet 2016 - 29 nov. 2014 à 19:56
most27 Messages postés 74 Date d'inscription mardi 29 octobre 2013 Statut Membre Dernière intervention 9 juillet 2016 - 30 nov. 2014 à 01:04
Bonsoir à tous.
Voila je débute avec la programmation Client/Serveur en java,j'ai deux programmes Client/Serveur leurs travaille consiste a:
Si le client envoie le mot "bye" alors le serveur lui convertie se mot en majuscule et lui renvoie, si nom le serveur lui envoi un message d'erreur.
voici les programmes:
programme Client
import java.io.*; 
import java.net.*;

class UDPClient {
public static void main(String args[]) throws Exception
{
try {
String serverHostname= args[0];

//On récupere la ligne courente
BufferedReader inFromUser = new BufferedReader(new InputStreamReader(System.in));

//On déclare une socket
DatagramSocket clientSocket = new DatagramSocket();

//on recupere l'adresse sur la quelle il faut envoyer le message (adresse local)
InetAddress IPAddress = InetAddress.getByName(serverHostname);
System.out.println ("Attemping to connect to " + IPAddress + ") via UDP port 9876");

byte[] sendData = new byte[1024];
byte[] receiveData = new byte[1024];

System.out.print("Enter Message: ");

//On recupere le message
String sentence = inFromUser.readLine();
sendData = sentence.getBytes();
System.out.println ("Sending data to " + sendData.length + " bytes to server.");
DatagramPacket sendPacket = new DatagramPacket(sendData, sendData.length, IPAddress, 9876);
//On envois le message
clientSocket.send(sendPacket);

//On prépare la reception du 1er message
DatagramPacket receivePacket = new DatagramPacket(receiveData, receiveData.length);


System.out.println ("Waiting for return packet");
//setSoTimeout(10000) le delai maximal d'attente 10000 mls
clientSocket.setSoTimeout(10000);

try {
clientSocket.receive(receivePacket);
String modifiedSentence = new String(receivePacket.getData());
InetAddress returnIPAddress = receivePacket.getAddress();
int port = receivePacket.getPort();
System.out.println ("From server at: " + returnIPAddress + ":" + port);
System.out.println("Message: " + modifiedSentence);
}


catch(SocketTimeoutException ste)
{
System.out.println ("Timeout Occurred: Packet assumed lost");
}

//clientSocket.close();
}

catch (UnknownHostException ex)
{
System.err.println(ex);
}
catch (IOException ex)
{
System.err.println(ex);
}
}
}

Programme serveur

import java.io.*;
import java.net.*;

class UDPServer {
public static void main(String args[]) throws Exception
{String var="bye";
var=var.intern();
try
{
DatagramSocket serverSocket = new DatagramSocket(9876);

byte[] receiveData = new byte[1024];
byte[] sendData1 = new byte[1024];
byte[] sendData2 = new byte[1024];
while(true) //while(true) permett au serveur de rester en ecoute
{

receiveData = new byte[1024];

DatagramPacket receivePacket =
new DatagramPacket(receiveData, receiveData.length);

System.out.println ("Waiting for datagram packet");

serverSocket.receive(receivePacket);

String sentence = new String(receivePacket.getData());
sentence=sentence.intern();


InetAddress IPAddress = receivePacket.getAddress();

int port = receivePacket.getPort();

System.out.println ("From: " + IPAddress + ":" + port);
System.out.println ("Message: " + sentence+var);
if(sentence==var)
{String capitalizedSentence = sentence.toUpperCase();

sendData1 = capitalizedSentence.getBytes();

DatagramPacket sendPacket1 = new DatagramPacket(sendData1, sendData2.length, IPAddress, port);

serverSocket.send(sendPacket1);
//serverSocket.close();
}

else if(sentence!=var)
{String phrase="donnez le mot bye";

sendData2 = phrase.getBytes();

DatagramPacket sendPacket2 = new DatagramPacket(sendData2, sendData2.length, IPAddress, port);

serverSocket.send(sendPacket2);
serverSocket.close();
}

}

}
catch (SocketException ex) {
System.out.println("UDP Port 9876 is occupied.");
System.exit(1);
}

}
//serverSocket.close();
}


Je n'arrive pas a comprendre pourquoi sa ne marche pas alors que j'ai utiliser la méthode
intern();
et j'ai créer deux buffer pour chaque condition
Je vous remercie d'avance pour votre aide :)

1 réponse

KX Messages postés 16734 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 24 avril 2024 127
29 nov. 2014 à 20:20
Bonjour,

"alors que j'ai utiliser la méthode intern();"
Évites d'utiliser intern dans un programme, à part faire un programme très pointu, tu n'en auras jamais besoin.

if(sentence==var)
Pour comparer deux String, utilises la méthode equals, comme pour n'importe quel objet.

De plus, sépares ton code en méthodes, il n'y a aucune raison de tout mettre dans le main, en plus cela permet de mutualiser du code qui serait commun au client et au serveur, ce qui est généralement le cas dans n'importe quel programme qui communiquent entre eux.
1
most27 Messages postés 74 Date d'inscription mardi 29 octobre 2013 Statut Membre Dernière intervention 9 juillet 2016
Modifié par most27 le 29/11/2014 à 21:25
Merci pour votre repense :)
0
most27 Messages postés 74 Date d'inscription mardi 29 octobre 2013 Statut Membre Dernière intervention 9 juillet 2016
29 nov. 2014 à 23:28
Voila j'ai fait ce que vous m'avait dit mais ça ne marche vraiment pas voici le code
Le programme serveur

import java.io.*;
import java.net.*;

class UDPServer {

static String comparer(String str2)
{
String str1 = "bye";
String msg1;
if (str1.equals(str2))
msg1=str1.toUpperCase();
else
msg1="Donner le mot bye !";
return msg1;
}


public static void main(String args[]) throws Exception
{

try
{
DatagramSocket serverSocket = new DatagramSocket(9876);

byte[] receiveData = new byte[1024];
byte[] sendData1 = new byte[1024];

while(true) //while(true) permett au serveur de rester en ecoute
{

receiveData = new byte[1024];

DatagramPacket receivePacket =
new DatagramPacket(receiveData, receiveData.length);

System.out.println ("Waiting for datagram packet");

serverSocket.receive(receivePacket);

String sentence = new String(receivePacket.getData());



InetAddress IPAddress = receivePacket.getAddress();

int port = receivePacket.getPort();

System.out.println ("From: " + IPAddress + ":" + port);
System.out.println ("Message: " + sentence);


String capitalizedSentence = comparer(sentence);

sendData1 = capitalizedSentence.getBytes();

DatagramPacket sendPacket1 = new DatagramPacket(sendData1, sendData1.length, IPAddress, port);

serverSocket.send(sendPacket1);


}

}
catch (SocketException ex) {
System.out.println("UDP Port 9876 is occupied.");
System.exit(1);
}

}
//serverSocket.close();
}


C'est toujours la même erreur que le premier c'est a dire même si je lui donne le mot bye il me dit que c'est différent de bye et j'ai essayé la fonction comparer() dans un programme simple ça marche très bien
La je block vraiment est ce que quelqu'un peut m'aider merci d'avence :)
0
KX Messages postés 16734 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 24 avril 2024 127
30 nov. 2014 à 00:04
Il faudrait que tu utilises un débogueur, par exemple avec Eclipse, tu verrais rapidement d'où vient le problème.

Lorsque tu fais
String sentence = new String(receivePacket.getData());
les données que tu récupères sont stockées dans
byte[] receiveData = new byte[1024];
du coup, le String va faire 1024 caractères, il ne peut donc pas être égal à "bye", en réalité ce sera "bye" suivie de 1021 caractères
'\0'
(puisque un new byte[1024] est initialisé avec que des 0)

Pour résoudre ton problème, tu dois récupérer les données qui te sont envoyées, mais également leur taille (3 octets ici), ce que tu peux faire avec
receivePacket.getLength();
tu pourras alors découper ton String correctement et donc recevoir "bye" comme il a été envoyé.

Changes ta ligne 40 par ceci :

receivePacket.getData();
int length = receivePacket.getLength();
byte[] cutData = Arrays.copyOf(receiveData, length); // import java.util.Arrays
String sentence = new String(cutData);

Cela permettra à ton code de fonctionner, maintenant je t'invites à faire un gros travail de ménage dans le code, parce que c'est très moche en l'état.
0
most27 Messages postés 74 Date d'inscription mardi 29 octobre 2013 Statut Membre Dernière intervention 9 juillet 2016
30 nov. 2014 à 01:04
Merci beaucoup pour votre aide ça marche très bien
0
Rejoignez-nous