Serveur/client buggé

cs_Bouki Messages postés 43 Date d'inscription vendredi 30 août 2002 Statut Membre Dernière intervention 11 décembre 2004 - 10 mars 2004 à 21:10
kirua12 Messages postés 1155 Date d'inscription samedi 17 janvier 2004 Statut Membre Dernière intervention 29 avril 2011 - 10 mars 2004 à 22:20
Salut,
J'ai un gros problème avec ce programme que j'ai pris d'un livre et adapté à mon cas. En fait il doit récupérer les entrées de l'utilisateur et les transmettre à tous les connectés. Voilà le programme :

import java.io.*;
import java.net.*;
import java.util.*;

public class Serveur
{
public static void main(String[] args)
{
System.out.println("Serveur de chat lancé...");
try
{
ServerSocket Paquet = new ServerSocket(4444);
Socket Liste_connections[] = new Socket[10];
Liste_connections[Nombre_connections] = Paquet.accept();
Nombre_connections++;
Thread Tache = new TravailServeur(Liste_connections, Nombre_connections);
Tache.start();
}
catch (Exception Erreur_connection)
{Erreur_connection.printStackTrace();}
}
private static byte Nombre_connections;
}

class TravailServeur extends Thread
{
public TravailServeur(Socket Tableau_connections[], byte Nombre_connections)
{
IP = Tableau_connections[Nombre_connections];
IPS = Tableau_connections;
}

public void run()
{
try
{
Fin_connection = false;
Flux_entree = new BufferedReader(new InputStreamReader(IP.getInputStream()));
while (Fin_connection == false)
{
Texte = Flux_entree.readLine();
if (Texte.equals("KILL CONNECTION"))
{Fin_connection = true;}
for (byte Nombre = 0; Nombre < IPS.length; Nombre++)
{
Flux_sortie = new PrintWriter(IPS[Nombre].getOutputStream(), true);
Flux_sortie.println("Utilisateur : " + Texte);
}
System.out.println("Utilisateur : " + Texte);
}
IP.close();
}
catch (Exception Erreur)
{Erreur.printStackTrace();}
}

private Socket IP;
private Socket IPS[];
private String Texte;
private PrintWriter Flux_sortie;
private BufferedReader Flux_entree;
private boolean Fin_connection;
}

Quand je le lance j'ai ça :
Serveur de chat lancé...
et dès que je lance telnet 127.0.0.1 4444 j'ai :
java.lang.NullPointerException
at TravailServeur.run(Serveur.java:41)

la ligne 41 étant :
Flux_entree = new BufferedReader(new InputStreamReader(IP.getInputStream()));

dans le contexte :
Fin_connection = false;
Flux_entree = new BufferedReader(new InputStreamReader(IP.getInputStream()));
while (Fin_connection == false)

voilà. Je suis vraiment désespérés sur le pb, g bo chercher je trouve pas, merci bcp à celui qui trouve.
@+

6 réponses

kirua12 Messages postés 1155 Date d'inscription samedi 17 janvier 2004 Statut Membre Dernière intervention 29 avril 2011 7
10 mars 2004 à 21:26
Salut,

c'est normal car IP est null.
Cette ligne là :
Liste_connections[Nombre_connections] = Paquet.accept();
met une socket à l'indice 0 dans le tableau;

puis tu fais Nombre_connections++; //qui vaut 1 maintenant

enfin IP = Tableau_connections[Nombre_connections];
initialise IP avec la socket à l'indice 1 qui d'après ton code vaut null (non initialisé).

Solution : soit tu initialises IP avec Tableau_connections[Nombre_connections-1]
ou tu passes la socket en paramètre du constructeur ou autre ...
0
cs_Bouki Messages postés 43 Date d'inscription vendredi 30 août 2002 Statut Membre Dernière intervention 11 décembre 2004
10 mars 2004 à 21:43
Merci j'ai résolu un premier pb mais aparemment y'en a un deuxième !
Voilà le bout de code qui pose pb :
for (byte Nombre = 0; Nombre < IPS.length; Nombre++)
{
Flux_sortie = new PrintWriter(IPS[Nombre].getOutputStream(), true);
Flux_sortie.println("Utilisateur : " + Texte);
}

plus précisément cette ligne :
Flux_sortie = new PrintWriter(IPS[Nombre].getOutputStream(), true);

maintenant je peux lancer telnet, écrire un peu et quand je clique sur entrée j'ai ça :

java.lang.NullPointerException
at TravailServeur.run(Serveur.java:49)

comme erreur et telnet se ferme avec le programme.
Encore un pb avec un tableau ?
0
kirua12 Messages postés 1155 Date d'inscription samedi 17 janvier 2004 Statut Membre Dernière intervention 29 avril 2011 7
10 mars 2004 à 21:56
t'es sûr que tous les éléments du tableau sont initialisés ?
Quand tu fais une boucle sur un tableau soit on est sûr que tous les éléments sont non null ou mieux on teste si les élément sont null :
for (byte Nombre = 0; Nombre < IPS.length; Nombre++)
{
if(IPS[Nombre]!=null){
Flux_sortie = new PrintWriter(IPS[Nombre].getOutputStream(), true);
Flux_sortie.println("Utilisateur : " + Texte);
}
}

Sinon tu pourrais utiliser une List ce qui t'éviterait ces problèmes
0
cs_Bouki Messages postés 43 Date d'inscription vendredi 30 août 2002 Statut Membre Dernière intervention 11 décembre 2004
10 mars 2004 à 22:09
merci bcp bcp grace à toi ca marche impec ;)
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
kirua12 Messages postés 1155 Date d'inscription samedi 17 janvier 2004 Statut Membre Dernière intervention 29 avril 2011 7
10 mars 2004 à 22:10
j'ai un peu mieux regardé ton code et il y a quelques trucs que je trouve étrange.
Pourquoi ton thread serveur ne fait qu'écouter ce que dit le client plutôt de gérer le connexions ? tu récupères la socket pour le client dans le main alors que tu devrais le faire dans la boucle d'attente du serveur. Et ce que fait ton serveur devrait être dans un autre thread dédié au client (serveur multithreadé) sinon pourquoi avoir un tableau de socket dans le serveur si il ne peut gérer qu'un client ?
T'es sûr d'avoir bien repris l'exemple ?
0
kirua12 Messages postés 1155 Date d'inscription samedi 17 janvier 2004 Statut Membre Dernière intervention 29 avril 2011 7
10 mars 2004 à 22:20
si ça marche tant mieux, ce n'est donc pas la peine de prendre en compte ma dernière remarque.
0
Rejoignez-nous