Client/Serveur : probleme communication avec flux clavier
Bonjour,
Voici mon soucis, je voudrais faire un programme basé sur l'architecture Client/Serveur à l'aide des sockets!
J'arrive très bien à faire l'échange tour à tour entre le serveur et le client (c'est à dire que chacun parle chacun leur tour). Mais voila, si l'un des deux, parle deux fois de suite le premier message est envoyé correctement à l'autre mais le second est comme enregistré et directement envoyé lorsque celui reprend la main! N'est pas possible de vider ou désactiver le buffer du clavier après avoir tapé quelque chose?
Voici mes deux classes:
mon Serveur:
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97
|
package jabberServer;
import java.io.*;
import java.net.*;
import java.util.logging.Level;
import java.util.logging.Logger;
public class JabberServer {
public static int PORT = 8080; // Choisir un port hors de la plage 1-1024
public void Traitement() {
ServerSocket serverSock = null;
Socket socket = null;
try {
serverSock = new ServerSocket(PORT);
try {
socket = serverSock.accept(); // Le prog stoppe et attend une connexion
} catch (IOException ex) {
Logger.getLogger(JabberServer.class.getName()).log(Level.SEVERE, null, ex);
}
try {
// Buffer entrée du socket
BufferedReader in = new BufferedReader(new InputStreamReader(socket.getInputStream()));
// Buffer sortie vers socket
PrintWriter out = new PrintWriter(socket.getOutputStream());
String str = new String();
boolean tour = false;
while (true) {
// Si c'est à notre tour de jouer
if (tour) {
// On écrit du texte en paramètre
out.println(SaisieCoup());
// Envoi dans le flux de sortie
out.flush();
tour = false;
}
// En attente du coup de l'autre joueur
else {
// Récupération du flux
str = in.readLine();
// Affichage
System.out.println("Echoing: " + str);
tour = true;
}
}
} finally {
System.out.println("closing...");
socket.close();
}
} catch (IOException ex) {
System.out.println("ERREUR dans le socket du serveur");
} finally {
try {
serverSock.close();
} catch (IOException ex) {
System.out.println("ERREUR dans la fermeture du socket");
}
}
}
private String SaisieCoup() {
String temp = new String();
// Buffer entrée du clavier
BufferedReader inputClavier = new BufferedReader (new InputStreamReader(System.in));
boolean exit = false;
int resultat = 0;
while (!exit){
try {
System.out.println("Quelle case?");
temp = inputClavier.readLine();
try{
resultat = Integer.parseInt(temp);
} catch (NumberFormatException ex) {
System.out.println("Veuillez entrer un nombre!");
}
if ((resultat > 0) && (resultat < 10)) {
exit = true;
}
} catch (IOException e) {
System.out.println("ERREUR dans l'entrée calvier");
}
}
return temp;
}
public static void main(String[] args) {
JabberServer jabberS = new JabberServer();
jabberS.Traitement();
}
} |
et mon client:
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92
|
package jabberClient;
import java.net.*;
import java.io.*;
import jabberServer.JabberServer;
public class JabberClient {
public void Traitement() {
InetAddress addr = null;
Socket socket = null;
try {
addr = InetAddress.getByName("localhost");
socket = new Socket(addr, JabberServer.PORT);
} catch (UnknownHostException ex) {
System.out.println("ERREUR dans l'InetAdress");
} catch (IOException ex) {
System.out.println("ERREUR dans le socket");
}
try {
// Affichage des caractéristique du socket
System.out.println("socket = " + socket);
// Buffer sortie vers le serveur
PrintWriter out = null;
// Buffer entrée du serveur
BufferedReader in = null;
try {
out = new PrintWriter(socket.getOutputStream());
in = new BufferedReader(new InputStreamReader(socket.getInputStream()));
} catch (IOException ex) {
System.out.println("ERREUR dans la récupération de l'entrée ou de la sortie du socket");
}
String str = new String();
boolean tour = true;
while (true){
// Si c'est à nous de jouer
if (tour) {
out.println(SaisieCoup());
out.flush();
tour = false;
}
// En attente du coup de l'autre joueur
else {
str = in.readLine();
System.out.println("Echoing: " + str);
tour = true;
}
}
//out.println("end");
} catch (IOException ex) {
System.out.println("ERREUR dans l'entrée du socket(readline())");
} finally {
try {
socket.close();
} catch (IOException ex) {
System.out.println("ERREUR dans la fermeture du socket");
}
}
}
private String SaisieCoup() {
String temp = new String();
// Buffer entrée du clavier
BufferedReader inputClavier = new BufferedReader (new InputStreamReader(System.in));
boolean exit = false;
int resultat = 0;
while (!exit){
try {
System.out.println("Quelle case?");
temp = inputClavier.readLine();
try{
resultat = Integer.parseInt(temp);
} catch (NumberFormatException ex) {
System.out.println("Veuillez entrer un nombre!");
}
if ((resultat > 0) && (resultat < 10)) {
exit = true;
}
} catch (IOException e) {
System.out.println("ERREUR dans l'entrée calvier");
}
}
return temp;
}
public static void main(String[] args) {
JabberClient jabberC = new JabberClient();
jabberC.Traitement();
}
} |
Je me prend la tête :bug:
Merci par avance ;)