Atropos Peace Love Death Metal | Bonjour,
Je débute en java et en réseaux, et j'ai pour objectif de programmer un service de messagerie instantanée basique (un nombre indéterminé de clients envoient et reçoivent des messages en temps réel)
Pour l'instant les clients consistent en Telnet, qui se connecte à mon serveur et envoie les messages.
Le serveur les reçoit bien, mais j'ai un problème pour envoyer à tous les clients le message reçu :
Code :
- port java.net.*;
- import java.io.*;
- public class server
- {
- public static void main (String arg[])
- {
- ServerSocket ecoute=null;
- try{
- ecoute=new ServerSocket(69,100);
- } catch (Exception e){
- erreur("Erreur lors de la création de la socket d'écoute ("+e+" )",3);
- }
- System.out.println("Serveur lance sur le port 69" );
- boolean serviceFini=false;
- Socket service[]=new Socket[100];
- boolean libre[]=new boolean[100];
- for (int i=0;i<100;i++)
- {
- libre[i]=true;
- }
- int i=0;
- while (! serviceFini)
- {
- try{
- while(libre[i]!=true)
- {i++;}
- service[i]=ecoute.accept();
- libre[i]=false;
- } catch (IOException e){
- erreur("Erreur lors de l'acceptation d'une connexion ("+e+" )",4);
- }
- try{
- System.out.println("## ["+identifie(service[i].getInetAddress())+","+service[i].getPort()+"] CONNECTE ("+i+" )" );
- } catch (Exception e) {
- erreur("identification liaison",1);
- }
- new traiteClientEcho(service,i,libre).start();
- }
- }
- }
- class traiteClientEcho extends Thread
- {
- private Socket[] service=new Socket[100];
- private BufferedReader in;
- private PrintWriter out;
- private int nb;
- private boolean libre[]=new boolean[100];
- public traiteClientEcho(Socket service[],int i,boolean libre[])
- {
- for(int j=0;j<100;j++)
- {
- this.service[j]=service[j];
- this.libre[j]=libre[j];
- }
- nb=i;
- }
- public void run()
- {
- try{
- in=new BufferedReader(new InputStreamReader(service[nb].getInputStream()));
- out=new PrintWriter(service[nb].getOutputStream(),true);
- out.println("## READY : "+nb);
- } catch (Exception e) {
- erreur("Erreur de creation flux",1);
- }
- String demande;
- String reponse;
- try{
- while ((demande=in.readLine())!=null)
- {
- reponse="["+identifie(service[nb].getInetAddress())+","+service[nb].getPort()+"] "+demande;
- //PARTIE QUI POSE PB : parcourir la liste des clients et envoyer le message
- for(int j=0;j<3;j++)
- {
- if (libre[j]=false) {
- out=new PrintWriter(service[j].getOutputStream(),true);
- out.println(nb+"->"+j+" "+reponse);
- }
- }
- out=new PrintWriter(service[nb].getOutputStream(),true);
- System.out.println("-> ["+identifie(service[nb].getInetAddress())+","+service[nb].getPort()+"] : "+demande);
- if(demande.trim().toLowerCase().equals("fin" )) {
- System.out.println("## ["+identifie(service[nb].getInetAddress())+":"+service[nb].getPort()+"] DECONNECTE" );
- out.println("## DECONNECTE de ["+identifie(service[nb].getInetAddress())+","+service[nb].getPort()+"]" );
- libre[nb]=true;
- break;}
- }
- } catch (IOException e){
- erreur("Erreur lors des échanges client/serveur ("+e+" )",3);
- }
- }
- }
|
Voilà j'ai enlevé les classes identifie et erreur pour plus de lisibilité
Si vous aviez une piste pour me mettre sur la voie car là je ne comprend pas ce qui cloche : le dernier client connecté envoie bien les messages, et ceux ci apparaissent chez les autres clients, mais dès que les autres clients envoient qqchose, ils se figent (mais reçoivent tjrs les messages du dernier client connecté) et la console renvoie :
Exception in thread "Thread-0" java.lang.NullPointerException
at traiteClientEcho.run(server.java:118) |
Merci d'avance |