Programmation Client/Serveur UDP [Résolu]

Messages postés
74
Date d'inscription
mardi 29 octobre 2013
Dernière intervention
9 juillet 2016
- - Dernière réponse : most27
Messages postés
74
Date d'inscription
mardi 29 octobre 2013
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 :)
Afficher la suite 

Votre réponse

1 réponse

Meilleure réponse
Messages postés
15863
Date d'inscription
samedi 31 mai 2008
Statut
Modérateur
Dernière intervention
14 décembre 2018
1
Merci
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.

Dire « Merci » 1

Quelques mots de remerciements seront grandement appréciés. Ajouter un commentaire

Codes Sources a aidé 104 internautes ce mois-ci

most27
Messages postés
74
Date d'inscription
mardi 29 octobre 2013
Dernière intervention
9 juillet 2016
-
Merci pour votre repense :)
most27
Messages postés
74
Date d'inscription
mardi 29 octobre 2013
Dernière intervention
9 juillet 2016
-
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 :)
KX
Messages postés
15863
Date d'inscription
samedi 31 mai 2008
Statut
Modérateur
Dernière intervention
14 décembre 2018
-
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.
most27
Messages postés
74
Date d'inscription
mardi 29 octobre 2013
Dernière intervention
9 juillet 2016
-
Merci beaucoup pour votre aide ça marche très bien
Commenter la réponse de KX

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.