[java] serveur de messagerie instantanée

serveur de messagerie instantanée [java] - Java - Programmation

Marsh Posté le 03-03-2006 à 15:10:37    

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 :
  1. port java.net.*;
  2. import java.io.*;
  3. public class server
  4. {
  5. public static void main (String arg[])
  6.  {
  7.  ServerSocket ecoute=null;
  8.  try{
  9.  ecoute=new ServerSocket(69,100);
  10.  } catch (Exception e){
  11.  erreur("Erreur lors de la création de la socket d'écoute ("+e+" )",3);
  12.  }
  13.  System.out.println("Serveur lance sur le port 69" );
  14.  boolean serviceFini=false;
  15.  Socket service[]=new Socket[100];
  16.  boolean libre[]=new boolean[100];
  17.  for (int i=0;i<100;i++)
  18.   {
  19.   libre[i]=true;
  20.   }
  21. int i=0;
  22.  while (! serviceFini)
  23.   {
  24.   try{
  25.   while(libre[i]!=true)
  26.   {i++;}
  27.   service[i]=ecoute.accept();
  28.   libre[i]=false;
  29.   } catch (IOException e){
  30.   erreur("Erreur lors de l'acceptation d'une connexion ("+e+" )",4);
  31.   }
  32.   try{
  33.   System.out.println("## ["+identifie(service[i].getInetAddress())+","+service[i].getPort()+"] CONNECTE ("+i+" )" );
  34.   } catch (Exception e) {
  35.   erreur("identification liaison",1);
  36.   }
  37.   new traiteClientEcho(service,i,libre).start();
  38.   }
  39.  }
  40. }
  41. class traiteClientEcho extends Thread
  42. {
  43. private Socket[] service=new Socket[100];
  44. private BufferedReader in;
  45. private PrintWriter out;
  46. private int nb;
  47. private boolean libre[]=new boolean[100];
  48. public traiteClientEcho(Socket service[],int i,boolean libre[])
  49.  {
  50.  for(int j=0;j<100;j++)
  51.  {
  52.  this.service[j]=service[j];
  53.  this.libre[j]=libre[j];
  54.  }
  55.  nb=i;
  56.  }
  57. public void run()
  58.  {
  59.  try{
  60.  in=new BufferedReader(new InputStreamReader(service[nb].getInputStream()));
  61.  out=new PrintWriter(service[nb].getOutputStream(),true);
  62.  out.println("## READY : "+nb);
  63.  } catch (Exception e) {
  64.  erreur("Erreur de creation flux",1);
  65.  }
  66.  String demande;
  67.  String reponse;
  68.  try{
  69.  while ((demande=in.readLine())!=null)
  70.   {
  71.   reponse="["+identifie(service[nb].getInetAddress())+","+service[nb].getPort()+"] "+demande;
  72. //PARTIE QUI POSE PB : parcourir la liste des clients et envoyer le message
  73.   for(int j=0;j<3;j++)
  74.    {
  75.    if (libre[j]=false) {
  76.    out=new PrintWriter(service[j].getOutputStream(),true);
  77.    out.println(nb+"->"+j+" "+reponse);
  78.    }
  79.    }
  80.   out=new PrintWriter(service[nb].getOutputStream(),true);
  81.   System.out.println("-> ["+identifie(service[nb].getInetAddress())+","+service[nb].getPort()+"] : "+demande);
  82.   if(demande.trim().toLowerCase().equals("fin" )) {
  83.   System.out.println("## ["+identifie(service[nb].getInetAddress())+":"+service[nb].getPort()+"] DECONNECTE" );
  84.   out.println("## DECONNECTE de ["+identifie(service[nb].getInetAddress())+","+service[nb].getPort()+"]" );
  85.   libre[nb]=true;
  86.   break;}
  87.   }
  88.  } catch (IOException e){
  89.  erreur("Erreur lors des échanges client/serveur ("+e+" )",3);
  90.  }
  91.  }
  92. }


 
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  :hello:

Reply

Marsh Posté le 03-03-2006 à 15:10:37   

Reply

Marsh Posté le 03-03-2006 à 16:11:35    

Citation :

Voilà j'ai enlevé les classes identifie et erreur pour plus de lisibilité


 
Humm j'imagine que ce sont des méthode et non des classes...
 
 

Citation :

Exception in thread "Thread-0" java.lang.NullPointerException
  at traiteClientEcho.run(server.java:118)


 
J'ai une idée folle : si tu allais voir la ligne 118 de ton fichier server.java (*) tu trouverais ton problème.
 
A priori tu lance une méthode sur un objet non initialisé (c'est ce que veut dire NullPointerException)
 
PS : (*) le nom des classes doit commencer par une majuscule


Message édité par Bidem le 03-03-2006 à 16:12:19
Reply

Marsh Posté le 04-03-2006 à 12:25:14    

En effet ce sont des méthodes :D
 
Je savais que l'erreur était a la ligne 118 mais je ne trouvais pas ce qui clochait. Mais j'ai fait un thread dédié à cette tache et ça marche :)
 
Pour les conventions sur les noms faut que je m'y mette j'y pense jamais.
 
Merci pour ta réponse :hello:

Reply

Marsh Posté le 04-03-2006 à 13:21:15    

c'est facile de faire ce que tu veux faire. Regarde les classes MulticastSocket
 
suffit de lui donné une adresse de classe D. Et tous les clients s'initialisant sur cette adresse recevront automatiquement les messages. C'est une histoire d'une dixaine de ligne grand maximum pour le serveur, et la même chose pour le client. C'est d'une simplicité.  
 
=> MulticastSocket / MulticastPacket sont les deux classes les plus importantes.  
Le choix de l'adresse de classe D, c'est toi qui la choisi, c'est comme tu veux, la seule contrainte, c'est qu'ils ont tous la même afin de recevoir tous les messages envoyés par les autres membres.  
Pour la réception des messages dans une application java, il faut avoir un thread de réception. Donc, pas besoin d'avoir un serveur pour le multicast. Tu initialise la connexion avec MulticastSocket, tu te join au groupe, et tu envoie / reçoit les messages envoyé et reçu sur cette adresse.  ;-) si tu d'autres questions concernant le multicast, n'hésite pas. ou contacte moi par email...

Reply

Marsh Posté le 02-07-2008 à 12:37:56    

bonjour
moi aussi je suis débutante en java et réseau, je passe un stage dont le sujet est de créer un service de messagerie instantanée en java (interface avec netbeans), le probleme c'est que je ne sais pas par où commencer, si vous voudriez bien me guider je vous serais reconnaissante. :jap:  
merci d'avance :hello:

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed