Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
3019 connectés 

  FORUM HardWare.fr
  Programmation
  Java

  [java] serveur de messagerie instantanée

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

[java] serveur de messagerie instantanée

n°1317849
Atropos
Peace Love Death Metal
Posté le 03-03-2006 à 15:10:37  profilanswer
 

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:

mood
Publicité
Posté le 03-03-2006 à 15:10:37  profilanswer
 

n°1317924
Bidem
Posté le 03-03-2006 à 16:11:35  profilanswer
 

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
n°1318385
Atropos
Peace Love Death Metal
Posté le 04-03-2006 à 12:25:14  profilanswer
 

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:

n°1318408
moi23372
Posté le 04-03-2006 à 13:21:15  profilanswer
 

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

n°1754520
meryazer
peace & love
Posté le 02-07-2008 à 12:37:56  profilanswer
 

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:


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  Java

  [java] serveur de messagerie instantanée

 

Sujets relatifs
[J2ME] Transfert Midlet - serveur httpFunction mail() et serveur smtp perso
Java Socket & Crontabappel d'une commande shell à partir d'un programme java
erreur de compilation java.langimporter un base access dans SQL serveur 2005 express
Présentation javaprogrammation java/ihm
[java.util.UUID] y a-t-il une implémentation libre ?Digest entre JAVA et .NET
Plus de sujets relatifs à : [java] serveur de messagerie instantanée


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR