NullPointerException, client serveur JAVA

Résolu/Fermé
euphina Messages postés 6 Date d'inscription mardi 8 mars 2016 Statut Membre Dernière intervention 1 avril 2017 - Modifié par KX le 21/03/2016 à 18:16
euphina Messages postés 6 Date d'inscription mardi 8 mars 2016 Statut Membre Dernière intervention 1 avril 2017 - 25 mars 2016 à 22:12
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 ->

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
  
 }
}

1 réponse

KX Messages postés 16733 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 31 janvier 2024 3 015
21 mars 2016 à 18:21
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
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 ?
0
euphina Messages postés 6 Date d'inscription mardi 8 mars 2016 Statut Membre Dernière intervention 1 avril 2017
22 mars 2016 à 13:30
Salut, merci d'abord d'avoir pris le temps de répondre ^^, j'ai essayé d'initialisé comme tu me la recommandé et j'ai tjr exactement le méme probléme ... pourtant ça marche quand je fais la recuperation dans le main , mais quand c effectuer dans le run() de joueurClient ça ne marche plus :(

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)
0
KX Messages postés 16733 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 31 janvier 2024 3 015
22 mars 2016 à 19:43
Est ce que tu pourrais changer les numéros de ligne dans la stack trace pour que les lignes de code correspondent à celles publiées sur le forum ?
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 ?
0
euphina Messages postés 6 Date d'inscription mardi 8 mars 2016 Statut Membre Dernière intervention 1 avril 2017
23 mars 2016 à 22:00
La ligne 91 correspond a la ligne 57 du joueurClient(), c la seule ligne qui bug dans mon programme :Exception in thread "Thread-0" java.lang.NullPointerException
la ligne 107 represente la ligne 71 de ma classe joueurClient ( c l'appel à la fonction qui contient la ligne 57 )

:))
0
KX Messages postés 16733 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 31 janvier 2024 3 015
24 mars 2016 à 00:42
L'attribut dIn (ligne 22 de joueurClient) n'est jamais initialisé. Il vaut null par défaut et cette valeur n'est jamais modifiée. Donc quand tu appelles run() tu fais "null.readUtf ()" ce qui conduit à un NullPointerException.
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...)
0
euphina Messages postés 6 Date d'inscription mardi 8 mars 2016 Statut Membre Dernière intervention 1 avril 2017
25 mars 2016 à 22:12
Ha merci beaucoup ça marche mntnt ^^ (y)
0