NullPointerException, client serveur JAVA
Résolu
euphina
Messages postés
6
Date d'inscription
Statut
Membre
Dernière intervention
-
euphina Messages postés 6 Date d'inscription Statut Membre Dernière intervention -
euphina Messages postés 6 Date d'inscription Statut Membre Dernière intervention -
Salut à tous, dans le cadre de mes études il m'a été demandé de coder une application client serveur en JAVA dans le but d’implémenter un jeu .
Je suis débutante donc je vois encore un peu flou en matiére de socket et de Thread
Mon probléme est clair, la communication du client vers le serveur marche , parcontre l'envoie d'un message du serveur vers le client ne marche pas dans le cas ou j'essaye de récupérer le flux dans la methode run() de mon Client extends Runnable.
quand je le recupere dans le main ça marche parfaitement bien, or j'ai besoin de le recuperer dans le run() car aprés quand j'avancerai dans mon projet je devrai passer en paramétre mon objet Client à une méthode pour la creation de l'interface graphique...
cLa comprehension d code de joueurClient et de joueur n'est pas necessaire a ce stade car mon probléme est un nullpointerexception a la ligne de la methode de LectureBuffer() et dans le run lors de l'appel de cette méthode.
je tiens à preciser que lors du debugage avec eclipse la ligne (message = dIn.readUTF()) de la methode LectureBuffer leve l'exception de mon Main...
Merci D'avance pour n'importe quelle explication possible ou n'importe quelle lueur de réponse ... :)))
voici mon code :
le Serveur ->
La classe SSocket ->
la classe joueurClient->
la classe joueur ->
Je suis débutante donc je vois encore un peu flou en matiére de socket et de Thread
Mon probléme est clair, la communication du client vers le serveur marche , parcontre l'envoie d'un message du serveur vers le client ne marche pas dans le cas ou j'essaye de récupérer le flux dans la methode run() de mon Client extends Runnable.
quand je le recupere dans le main ça marche parfaitement bien, or j'ai besoin de le recuperer dans le run() car aprés quand j'avancerai dans mon projet je devrai passer en paramétre mon objet Client à une méthode pour la creation de l'interface graphique...
cLa comprehension d code de joueurClient et de joueur n'est pas necessaire a ce stade car mon probléme est un nullpointerexception a la ligne de la methode de LectureBuffer() et dans le run lors de l'appel de cette méthode.
je tiens à preciser que lors du debugage avec eclipse la ligne (message = dIn.readUTF()) de la methode LectureBuffer leve l'exception de mon Main...
Merci D'avance pour n'importe quelle explication possible ou n'importe quelle lueur de réponse ... :)))
voici mon code :
le Serveur ->
import java.net.ServerSocket; import java.net.Socket; public class Server { public static void main(String[] args) { int port = 666; //random port number try { ServerSocket ss = new ServerSocket(port); System.out.println("Waiting for a client...."); System.out.println(); while(true){ Socket socket = ss.accept(); SSocket sSocket = new SSocket(socket); Thread t = new Thread(sSocket); t.start(); } } catch (Exception e) { } }}
La classe SSocket ->
class SSocket implements Runnable { private Socket socket; public SSocket(Socket socket) { this.socket = socket; } @Override public void run() { try { InputStream in = socket.getInputStream(); OutputStream out = socket.getOutputStream(); DataInputStream dIn = new DataInputStream(in); DataOutputStream dOut = new DataOutputStream(out); String line = null; while (true) { line = dIn.readUTF(); System.out.println(" nous avons reçu -> " + line); String r = "BIENVENUE"; dOut.writeUTF(r); System.out.println("fin !!!"); socket.close(); } } catch (Exception e) { } }}
la classe joueurClient->
package clientThread; import tools.commandes; import tools.interpretationCmds; import java.io.BufferedReader; import java.io.DataInputStream; import java.io.DataOutputStream; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; import java.io.OutputStream; import java.net.InetAddress; import java.net.Socket; import java.util.Scanner; public class joueurClient extends joueur implements Runnable { protected String message; private static String chaine; private commandes com; private BufferedReader canalLecture; public DataInputStream dIn; // constructeur vide public joueurClient() { } // constructeur paramétrés ( pour plusieurs joueurs) public joueurClient(Socket socket) throws Exception { super(socket); adversaire = new joueurClient(); } // Methode pour traiter chacune des commandes du serveur public void traiterMessage(commandes message) { System.out.println("J'ai reçu la commande : " + message); switch (interpretationCmds.enumFromCommande(message)) { case BIENVENUE: stpmarche(); break; case CONNECTE: break; case DECONNEXION: } setChanged(); notifyObservers(); } // Methode pour lire les commandes envoyées par le serveur public void LectureBuffer(){ message="BIENVENUE"; try { while ((message = dIn.readUTF()) != null) { com = new commandes(message); System.out.println(message); traiterMessage(com); } } catch (IOException e) { System.out.println("erreur"); } } // Tantque le jeu n'est pas fini les commandes venant du serveur sont // traitées public void run() { System.out.println("salut"); LectureBuffer(); try { } catch (Exception exc) { exc.printStackTrace(); } } // main avec connexion au serveur ... public static void main(String[] args) { int serverPort = 666; try { InetAddress inetAdd = InetAddress.getByName("127.0.0.1"); Socket socket = new Socket(inetAdd, serverPort); InputStream in = socket.getInputStream(); OutputStream out = socket.getOutputStream(); DataInputStream dIn = new DataInputStream(in); DataOutputStream dOut = new DataOutputStream(out); BufferedReader keyboard = new BufferedReader(new InputStreamReader( System.in)); System.out.println("signal du client"); String line = null; System.out.println(); line = keyboard.readLine(); System.out.println("envoie au serveur"); dOut.writeUTF(line); dOut.flush(); //String message = dIn.readUTF(); //System.out.println(message); joueurClient s = new joueurClient(socket); s.run(); socket.close(); } catch (Exception e) { System.out.println("erreur ds lmain"); } } }
la classe joueur ->
package clientThread; import java.io.BufferedReader; import java.io.InputStreamReader; import java.io.PrintStream; import java.net.Socket; import java.util.Observable; public class joueur extends Observable implements Runnable{ protected joueur adversaire; protected BufferedReader in; protected static PrintStream out; protected boolean jeuFini=false; public joueur() {} public joueur(Socket socket) { try { in = new BufferedReader(new InputStreamReader(socket.getInputStream())); out = new PrintStream(socket.getOutputStream()); System.out.println("je fais quelque chose????"); } catch (Exception exc) { System.out.println("moi aussi je merde"); } (new Thread(this)).start(); adversaire = new joueur(); } public void stpmarche() { out.println("je marche ! "); } //numero joueur .. /*public Joueur(Socket socket, int numero) { this(socket); this.numero = numero; System.out.println("et moi :o"); }*/ @Override public void run() { // TODO Auto-generated method stub } }
A voir également:
- Exception in thread "thread-0"
- Jeux java itel - Télécharger - Jeux vidéo
- Waptrick java football - Télécharger - Jeux vidéo
- Cybera client - Télécharger - Divers Réseau & Wi-Fi
- Changer serveur dns - Guide
- Eclipse java - Télécharger - Langages
1 réponse
Bonjour,
J'avoue je n'ai pas tout lu, mais commençons par la question :
"la ligne (message = dIn.readUTF()) de la methode LectureBuffer leve l'exception de mon Main..."
Cela signifie que
Une cause subtile d'erreur c'est que tu as deux
J'avoue je n'ai pas tout lu, mais commençons par la question :
"la ligne (message = dIn.readUTF()) de la methode LectureBuffer leve l'exception de mon Main..."
Cela signifie que
dIn == null, ce qui arrive notamment lorsque la variable n'est jamais initialisée.
Une cause subtile d'erreur c'est que tu as deux
DataInputStream dIn;le premier déclaré comme attribut de la classe et un deuxième dans la méthode main. As-tu bien initialisé le bon ?
Exception in thread "Thread-0" java.lang.NullPointerException
at clientThread.joueurClient.LectureBuffer(joueurClient.java:91)
at clientThread.joueurClient.run(joueurClient.java:107)
at java.lang.Thread.run(Unknown Source)
Parce que joueurClient ligne 91 dans ce que je vois on n'est plus dans LectureBuffer, quelles sont les vraies lignes de code qui plantent ?
la ligne 107 represente la ligne 71 de ma classe joueurClient ( c l'appel à la fonction qui contient la ligne 57 )
:))
Il faut que tu initialises l'attribut dIn quelque part, par exemple dans le constructeur que tu appelles ligne 110, tu pourrais passer la valeur du dIn que tu initialises ligne 91 (et qui sinon ne sert à rien...)