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

  FORUM HardWare.fr
  Programmation
  Java

  emission/reception su un client Java

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

emission/reception su un client Java

n°1598978
talium
Et c'est pas fini ©
Posté le 13-08-2007 à 14:41:22  profilanswer
 

bonjour,
 
Voilà je suis en train de programmer pour moi même (pour me préparer aux cours que je vais avoir en septembre) un petit programme Java utilisant les sockets.
 
Il ne fait rien de particulier, c'est un Telnet quoi (je l'ai appelé JTelnet pour m'aperçevoir que le nom était pris d'ailleurs  :cry: ) :  
 
-> on donne un serveur et un port
-> on entre des commandes en meme temps que l'on affiche les infos reçues du serveur
 
C'est le 2e point qui blesse : je n'ai trouvé nulle part d'ActionListener me permettant de savoir si je viens de recevoir des données. Je pense bien pouvoir contourner ca avec des threads (un thread qui vérifie en permanence avec une boucle while l'arrivée ou non de données) mais j'aurais aimé savoir si il n'y a pas une solution plus simple, plus légère ... pour apprendre quoi :)
 
Avez vous un autre moyen que les threads pour y parvenir ?
 
Merci d'avance à ceux qui prendront le temps de me répondre  :jap:


---------------
Les pièces jointes, c'est comme les bonbons, quand ça vient d'un inconnu, on n'accepte pas.
mood
Publicité
Posté le 13-08-2007 à 14:41:22  profilanswer
 

n°1598990
Deadog
Dain Bramaged
Posté le 13-08-2007 à 14:54:12  profilanswer
 

j'ai pas mon code qui faisait ça sous la main, mais en gros c'était un thread par client qui ne s'occupe que de lire (le read est bloquant au passage, alors tu peut faire ton while(1) tranquile, ça va pas bouffer ton processeur, si c'est ça que tu entend par "légèreté" ) et qui renvoie l'info à un autre thread par un mécanisme de listener fait soit même
 
c'est très simple à faire, le thread bah il ne fait que lire
et en ce qui conscerne le listener, c'est jsute définir une interface et une collection dans ton thread pour stocker les listeners. Après tu implémente ton listener dans un autre thread comme tu le ferais normallement. La petite pointe de difficulté étant qu'il ne faut pas oublié de crée un nouveau thread pour chaque listener que tu appel dans ton thread de lecture du socket.

n°1599011
talium
Et c'est pas fini ©
Posté le 13-08-2007 à 15:24:48  profilanswer
 

Mmh je résume :p
 
T'as un client, en 2 threads, 1 qui ne fait que lire, l'autre qui fait le reste (interface, envoi des commandes saisies par l'utilsiateur).
 
Le thread de lecture possède un listener que le thread principal peut utiliser avec ActionListener.
 
Si c'est ca, c'est ce à quoi je pensais au début avec les threads (à part que j'ai jamais touché aux listener fait maison, donc je voyais ca avec un appel à une méthode dans le thread principal pour l'affichage. si t'as un tuto bien fait pour les listener à portée de main je suis preneur :jap: ).
 
bon ben je me lance, merci bien pour ton aide :)


---------------
Les pièces jointes, c'est comme les bonbons, quand ça vient d'un inconnu, on n'accepte pas.
n°1599063
Deadog
Dain Bramaged
Posté le 13-08-2007 à 16:31:06  profilanswer
 

ça n'a rien de très compliqué, il suffit d'essayé de comprendre comme ça se passe avec les listeners habituel.
 
tu définie une interface "NetworkListener" qui possède une méthode, disons "networkEvent" avec en paramètre un objet contenant ce que tu veux transmettre à l'autre thread (soyons fou, disons que tu reçois directement des String, comme ça pas besoin de se créer un objet spécial pour l'exemple).
 
ton thread de lecture du socket va avoir cette gueule dans le run :

Code :
  1. while(this.active) {
  2.   String s = (String) monSocket.read ();
  3.  
  4.   if(s != null)
  5.     this.fireNetworkEvent (s);
  6. }


 
aux détails prés, je me souviens plus très bien comme on utlise les sockets (et doit y avoir un try catch à faire pour read pour capter les déco réseaux ou des trucs de ce genre).
 
ensuite, tu as la méthode fireNetworkEvent qui va se charger de lancer tout les event vers les listeners

Code :
  1. private void fireNetworkEvent (String event) {
  2.   for(NetworkListener client : this.myListeners)
  3.     new ThreadNetworkEvent (client, event).start ();
  4. }


 
avec  
 

Code :
  1. public class ThreadNetworkEvent extends Thread {
  2.   private final NetworkListener myClient;
  3.   private final String myEvent;
  4.   public ThreadNetworkEvent (NetworkListener client, String event) {
  5.     this.myclient = client;
  6.     this.myEvent = event;
  7.   }
  8.   public void run () {
  9.     this.myClient.networkEvent (this.myEvent);
  10.   }
  11. }


 
cette class pouvant très bien être déclaré directement dans ton thread de lecture ;)
 
le must étant d'éxécuter fireNetworkEvent aussi dans un thread pour éviter de trop bloquer le thread de lecture.
 
enfin, pour enregistrer tes listeners :

Code :
  1. private Collection<NetworkListener> myListeners;
  2. public addNetworkListener (NetworkListener client) {
  3.   this.myListeners.add(client);
  4. }


 
je te laisse le choix dans la création de la collection (la plus banale suffira)
 
Ensuite, tu implémente ton NetworkListener comme tu le ferais avec un listener normal.
Et évidemment, comme tout autre listener, garde à l'esprit que ta méthode appelée dans ton listener par le thread de lecture est éxécuté dans un thread à part, et donc si tu as divisé ton appli en 2 thread au début, un qui lit le réseau, et l'autre qui fait le reste, et bien tu n'es pas dans le thread qui s'occupe de l'appli et tu dois donc gérer la synchronisation si ton "networkEvent (String)" doit modifier qqlch dans le reste de l'appli.

n°1599082
talium
Et c'est pas fini ©
Posté le 13-08-2007 à 16:49:05  profilanswer
 

Ouah merci bien :jap:
 
Je regarde tout ca ce soir à tête reposée.


---------------
Les pièces jointes, c'est comme les bonbons, quand ça vient d'un inconnu, on n'accepte pas.

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

  emission/reception su un client Java

 

Sujets relatifs
Base de données de client sur logiciel libreSWING - JAVA Problème avec des sous-panneaux
Probleme Webservice serialisation AXIS --> Client .Net C#ALFACO recrute Développeurs JAVA/J2EE H/F en CDI
[Résolu] Problème de décalage de date java sous windows vistaobtenir @ IP client à partir de web service
Gestion des données dans une base en Client/ServeurBesoin d'expliquer le fonctionnement d'1 base de données a 1 client
[JAVA - SWING] Navigation entre pages[Java Web Start]Appli sur un serveur sans faire du http
Plus de sujets relatifs à : emission/reception su un client Java


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