most27
Messages postés71Date d'inscriptionmardi 29 octobre 2013StatutMembreDernière intervention 9 juillet 2016
-
29 nov. 2014 à 19:56
most27
Messages postés71Date d'inscriptionmardi 29 octobre 2013StatutMembreDerniè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); }
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();
KX
Messages postés16752Date d'inscriptionsamedi 31 mai 2008StatutModérateurDernière intervention31 août 2024127 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.
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és16752Date d'inscriptionsamedi 31 mai 2008StatutModérateurDernière intervention31 août 2024127 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.
most27
Messages postés71Date d'inscriptionmardi 29 octobre 2013StatutMembreDernière intervention 9 juillet 2016 30 nov. 2014 à 01:04
Merci beaucoup pour votre aide ça marche très bien
Modifié par most27 le 29/11/2014 à 21:25
29 nov. 2014 à 23:28
Le programme serveur
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 :)
30 nov. 2014 à 00:04
Lorsque tu fais les données que tu récupères sont stockées dans 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 (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 tu pourras alors découper ton String correctement et donc recevoir "bye" comme il a été envoyé.
Changes ta ligne 40 par ceci :
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.
30 nov. 2014 à 01:04