Bonjour ,
Excusez-moi encore une fois.Je fais une application client-serveur d'un jeu.Le problème est que le serveur ne reçoit rien alors que le client envoie le message.Quand je fais un br.ready() du côté du serveur , il renvoie tout le temps false et ça cale au niveau de mon br.readLine() .Je ne comprends pas pourquoi.Pourtant , du côté du client , je fais bien un pw.println() , puis , un pw.flush() .Quand je fais un pw.checkerror() du côté du client , quand je me loggue , ça retourne false , mais après , à chaque fois , ça retourne true.
Je sais que ce que je dis est un peu flou mais je n'ai pas arrêté de chercher sans trouver.Par contre , je vous ai mis une archive avec mon code.
Côté client :
Côté serveur :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
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 public ClientThread(ClientGUILogin log ,String nomJoueur , int port , String adresseServeur)throws Exception{ s = new Socket(adresseServeur,port); br = new BufferedReader(new InputStreamReader( s.getInputStream() ) ); pw = new PrintWriter(s.getOutputStream()); nomJ = nomJoueur ; clientGUIlogin = log ; } public void run(){ try{ traiterLogin(); traiterPartie(); } catch(Exception e){} finally{libererFlux();} } private void traiterLogin()throws Exception{ String ligneServeur , nomAdv ; char couleurJeton ; int numFinChamp; //utilisé pour trouver le '$' dans la réponse de login //envoi de la demande de login envoiMessage(""+Protocole.CMD_LOGIN+nomJ+Protocole.FIN_CHAMP+Protocole.END_OF_LINE); ligneServeur = br.readLine(); if(ligneServeur.charAt(0)==Protocole.CMD_LOGIN_PROTOCOL_ERROR){ JOptionPane.showMessageDialog(clientGUIlogin,"Veuillez introduire votre nom !!!"); throw new Exception("Erreur de protocole"); } else{//<CMD_LOGIN_OK><nomPartenaire$><couleurJetons><END_OF_LINE> numFinChamp = ligneServeur.lastIndexOf(Protocole.FIN_CHAMP); nomAdv = ligneServeur.substring(1,numFinChamp); couleurJeton = ligneServeur.charAt(numFinChamp+1); creationPartie(couleurJeton,nomJ,nomAdv); clientGUIlogin.setVisible(false); if( nomAdv.isEmpty() ) msg = "Vous n'avez pas encore de partenaire"; else msg = "Vous avez un nouveau partenaire : "+nomAdv+"\n ==>C'est Ã* votre adversaire de jouer"; maPartieGUI.rafraichirZoneDialogue(msg); } } public void effectueDelogging(){ msg = ""+Protocole.CMD_LOGOUT+nomJ+Protocole.END_OF_LINE; envoiMessage(msg); estPartieFinie = true ; clientGUIlogin.dispose(); try{br.close();} catch(Exception e){ System.err.println("erreur de fermeture du flux de lecture"); } } public void envoiMessage(String msg){ pw.println(msg); pw.flush(); } public void mouseReleased(MouseEvent e) { pointX = e.getX(); pointY = e.getY(); largeurJLabel = labelsGrilleJeu[0][0].getWidth(); hauteurJLabel = labelsGrilleJeu[0][0].getHeight(); colonne = ( (337+pointX)/largeurJLabel )-1 ; ligne = (150+pointY)/(hauteurJLabel+1) ; System.out.println("point X "+pointX); System.out.println("point Y "+pointY); if( pointX<-337 || pointX>-31){ msgInfoVersEcran("Zone non autorisée",JOptionPane.WARNING_MESSAGE); rafraichirZoneDialogue("Zone non autorisée"); } else threadClient.envoiMessage(""+Protocole.CMD_COMMANDE+couleurJeton+colonne+"$"+Protocole.END_OF_LINE); }
Merci.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
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 public ThreadJoueur(Socket s, int numThread)throws Exception{ String protocole,nomJ; sock = s ; this.br = new BufferedReader(new InputStreamReader(s.getInputStream())); this.pw = new PrintWriter(s.getOutputStream()) ; numJoueur = numThread ; protocole = br.readLine(); nomJ = protocole.substring(1,protocole.lastIndexOf(Protocole.FIN_CHAMP)); nomJ1 = nomJ; traiterLogin(numThread); } public void run(){ String read =""; while(!estPartieFinie){ try{ if(br.ready()){ System.out.println("avant le readline"+read); read = br.readLine() ; System.out.println("après le readline"+read); switch(read.charAt(0)){ case Protocole.CMD_LOGOUT : traiterLogout(); break; case Protocole.CMD_COMMANDE : traiterCommande(read); break; } } sleep(200); } catch(Exception e){} finally{ //libererFlux(); } } } public void traiterLogin(int tailleThread){ if(nomJ1.isEmpty()){ envoiMessage(""+Protocole.CMD_LOGIN_PROTOCOL_ERROR); libererFlux(); isOK = false ; return ; } else{ if( (tailleThread % 2) == 0 ){ envoiMessage(""+Protocole.CMD_LOGIN_OK+""+Protocole.FIN_CHAMP+Protocole.ROUGE+Protocole.END_OF_LINE); ServerEcoute.ajoutJeu(nomJ1,null); } else{ String adv = ServerEcoute.getNomJoueur(tailleThread-1); String msg = ""+Protocole.CMD_LOGIN+adv+Protocole.FIN_CHAMP+Protocole.JAUNE+Protocole.END_OF_LINE; envoiMessage(msg); //Il faut prévenir l'adversaire qu'il a désormais un joueur msg =""+Protocole.CMD_PARTENAIRE+nomJ1+Protocole.FIN_CHAMP+Protocole.END_OF_LINE ; ServerEcoute.envoiMessage(tailleThread-1, msg); ServerEcoute.ajoutJeu(null, nomJ1); } ServerEcoute.ajoutUtilisateur(nomJ1); } }
Partager