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

  FORUM HardWare.fr
  Programmation
  Java

  [Sockets] question sur les sockets ....

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

[Sockets] question sur les sockets ....

n°928594
Giansolo
ben ... rien....
Posté le 20-12-2004 à 21:41:15  profilanswer
 

salut a tous,
une petite question de conception en java au niveau des sockets :
je suis en train de créer l'équivalent d'un MSN messenger en java avec un coté serveur et un coté client.
les clients se connectent au serveur en utilisant des sockets et des threads... tout va bien.  
Ma question est :
 
Si dans les 2 thread (l'un d'envoi et l'autre de reception) on utilise les 2 mêmes sockets avec le même port ou bien on doit utiliser 2 ports differents ?
Est-ce que ca peut améliorer le flux si on a port pour les envois et un autre pour les receptions ?
 
merci d'avances au NetWork Masters...
giansolo

mood
Publicité
Posté le 20-12-2004 à 21:41:15  profilanswer
 

n°928977
benou
Posté le 21-12-2004 à 11:04:32  profilanswer
 

une socket ca communique dans les 2 sens => à moins que tu ais besoin de faire de l'envoi/reception en paralèlle (assez rare dans un protocol réseau) ca n'a aucun intérêt d'avoir 2 socket ou même 2 thread ...
 
Le serveur est un thread qui attend les connection. quand il en reçoit une, il démarre un thread en lui passant la socket et le thread hère la communication (dans les 2 sens) avec le client.
 
Tu prends n'importe quel tuto sur la prog réseau en java et tu auras des exemples et des explications ...


---------------
ma vie, mon oeuvre - HomePlayer
n°928983
FlorentG
Unité de Masse
Posté le 21-12-2004 à 11:09:01  profilanswer
 

Mais n'oublie pas qu'il te faut une licence pour pouvoir faire un client MSN Messenger ;)

n°929023
Giansolo
ben ... rien....
Posté le 21-12-2004 à 11:33:54  profilanswer
 

Tout d'abord, merci pour ta réponse.
 

benou a écrit :

Tu prends n'importe quel tuto sur la prog réseau en java et tu auras des exemples et des explications ...


 
Justement, j'ai consulté un bouquin ("OReilly, Java network Programming" ) et dans leur serveur test (pages 337, 338, 339) ils créent bien 2 threads (un thread d'emission et un thread de reception) qui utilise la meme socket. Dans le doute, j'ai demandé a mon prof de java, qui m'a répondu que "J'en pense que si tu veux tout faire avec un seul thread tu vas avoir des soucis de téléscopage de trames qui son solubles mais qui compliquent un peu les choses ...
Puisqu'on peut créer plusieurs threads...."
texto...
 
donc bon, vala vala... Je pense que je vais au final créer 2 threads qui agissent sur la meme socket... ca me semble bien...
merci encore!
gian

n°929153
benou
Posté le 21-12-2004 à 13:55:14  profilanswer
 

ben moi ca me semble mal ...  
et je vois aucun rapport entre le fait d'avoir un threads et du téléscopage de trame ... de toute façon, t'es en TCP => tu ne peux pas avoir (ou en tout cas savoir qu'il y a eu) téléscopage. T'es sûr qu'il y connait quelque chose ton prof ?
 
T'as définis un protocole réseau non ? c'est sous forme de QR (question-réponse) ? si oui, bon courrage avec tes 2 threads :/
 
edit: remarque, le mode QR pour un truc d'instant messaging c'est pas forcément adapté [:gratgrat] ...


Message édité par benou le 21-12-2004 à 13:56:43

---------------
ma vie, mon oeuvre - HomePlayer
n°929161
schnapsman​n
Zaford Beeblefect
Posté le 21-12-2004 à 14:09:03  profilanswer
 

bein c'est très bien au moins deux threads pour traiter une connection tcp/ip, une pour recevoir et une autre pour envoyer [:autobot]


---------------
From now on, you will speak only when spoken to, and the first and last words out of your filthy sewers will be "Sir!"
n°929166
benou
Posté le 21-12-2004 à 14:15:48  profilanswer
 

schnapsmann a écrit :

bein c'est très bien au moins deux threads pour traiter une connection tcp/ip, une pour recevoir et une autre pour envoyer [:autobot]


génaralement tu as un thread qui écoute, effectivement, mais celui qui envoie c'est soit celui qui écoute (réponse à une intérogation), soit le thread global de l'application (le thread principal du serveur, ou l'IHM du client).  
 
Je vois pas l'intérêt d'utiliser un autre thread pour envoyer ... à part pour le serveur pour paralléliser les envois, mais ca me parait pas vraiment utile pour de l'IM...


Message édité par benou le 21-12-2004 à 14:16:47

---------------
ma vie, mon oeuvre - HomePlayer
n°929172
benou
Posté le 21-12-2004 à 14:17:42  profilanswer
 

question : dans le cas où t'as 2 threads, il fait quoi ton thread d'envoi dans le cas général où y a encore rien à envoyer ?


---------------
ma vie, mon oeuvre - HomePlayer
n°929175
FlorentG
Unité de Masse
Posté le 21-12-2004 à 14:22:48  profilanswer
 

Il attend qu'on lui file quelque chose à envoyer...

n°929177
schnapsman​n
Zaford Beeblefect
Posté le 21-12-2004 à 14:25:37  profilanswer
 

benou a écrit :

question : dans le cas où t'as 2 threads, il fait quoi ton thread d'envoi dans le cas général où y a encore rien à envoyer ?


 
déjà le thread en réception, il bloque la plupart du temps en lecture; quant au thread d'envoi, pour une petite impl on peut l'almagamer au thread de traitement principal... [:itm]


---------------
From now on, you will speak only when spoken to, and the first and last words out of your filthy sewers will be "Sir!"
mood
Publicité
Posté le 21-12-2004 à 14:25:37  profilanswer
 

n°929181
benou
Posté le 21-12-2004 à 14:29:16  profilanswer
 

schnapsmann a écrit :

déjà le thread en réception, il bloque la plupart du temps en lecture; quant au thread d'envoi, pour une petite impl on peut l'almagamer au thread de traitement principal... [:itm]


on est d'accord donc [:itm]


Message édité par benou le 21-12-2004 à 14:29:40

---------------
ma vie, mon oeuvre - HomePlayer
n°929182
benou
Posté le 21-12-2004 à 14:30:51  profilanswer
 

FlorentG a écrit :

Il attend qu'on lui file quelque chose à envoyer...


bha ouais. T'avoueras que c'est pas top l'intérêt d'un thread par utilisateur qui est en pause 95% du temps ...


---------------
ma vie, mon oeuvre - HomePlayer
n°929186
Giansolo
ben ... rien....
Posté le 21-12-2004 à 14:33:30  profilanswer
 

oua merci les keums,
je vais debattre de ca avec mon binome puis avec mon prof.
Gian

n°929644
veryfree
Posté le 22-12-2004 à 00:13:50  profilanswer
 

FlorentG a écrit :

Mais n'oublie pas qu'il te faut une licence pour pouvoir faire un client MSN Messenger ;)


 
 
l'embrouille pas toi  [:tt tt dago tt]  
 
 
personne l'a cette fichu licence qui plus est :o


Message édité par veryfree le 22-12-2004 à 00:14:09
n°929856
Giansolo
ben ... rien....
Posté le 22-12-2004 à 11:14:27  profilanswer
 

J'ai un probleme avec les Threads, je n'arrive pas à les stocker dans un vecteur. Meme en regardant l'aide de l'API a cette adresse http://java.sun.com/developer/tech [...] rcode.html
ca ne marche pas et j'ai une erreur nullpointerexception quand j'affiche le vecteur alors que si j'affiche le thread ca marche.
Merci de vos reponses.
Gian

n°929868
benou
Posté le 22-12-2004 à 11:19:55  profilanswer
 

sans code ni stacktrace ou pourra pas t'aider.
 
et les nullpointerexception, c'est des erreurs con => en cherchant un peu tout seul tu vas la trouver ta variable que t'as pas initialisée ...


---------------
ma vie, mon oeuvre - HomePlayer
n°929876
Giansolo
ben ... rien....
Posté le 22-12-2004 à 11:25:18  profilanswer
 

Voici mon code:
 

Code :
  1. ThreadServeur currentThread = new ThreadServeur(client);
  2. (new Thread(currentThread,"currentThread" +i)).start();
  3. liste_threads.addElement(currentThread);
  4. System.out.println("vecteur: "+ liste_threads);


 
 
et voici l'erreur avec printstacktrace:

Code :
  1. java.lang.NullPointerException
  2.         at Serveur.main(Serveur.java:35)


Message édité par Giansolo le 22-12-2004 à 11:25:58
n°929880
benou
Posté le 22-12-2004 à 11:27:21  profilanswer
 

et tu le créé où ton vecteur liste_threads ?
 


---------------
ma vie, mon oeuvre - HomePlayer
n°929883
Giansolo
ben ... rien....
Posté le 22-12-2004 à 11:29:52  profilanswer
 

On est trop une bite, on a pas fait de new Vector().
Cimer Benou

n°930051
Harkonnen
Modérateur
Un modo pour les bannir tous
Posté le 22-12-2004 à 14:33:01  profilanswer
 


[:yo]

n°930998
Giansolo
ben ... rien....
Posté le 23-12-2004 à 15:31:46  profilanswer
 

resalut a tous,  
alors la je dois avouer que ca commence à tourner doucemement. Pour gérer les connexions j'ai parcouru un peu le forum et je me suis mis a faire un watchdog.
Ce watchdog qui utilise les sockets d'entrée et de sortie établies entre le server et le client pour véhiculer des messages particulier qui lui permettent de savoir si le client est connecté.
Donc voici le code :
 

Code :
  1. watchdog = new Thread() {
  2.         public void run()
  3.         {
  4.                 try {
  5.                     sendMessage(new Statut_con());
  6.                     Thread.sleep(10000);                             
  7.                 }
  8.                 catch (InterruptedException _)
  9.                 { }
  10.                 catch(Exception e)
  11.                 {
  12.                     System.out.println("erreur WATCHDOG" );System.exit(-1);
  13.                 }
  14.                 System.out.println("Failure:   Time out." );
  15.                 System.exit(-1);
  16.             }
  17.         };
  18.         watchdog.start();

 
 
et une boucle dans le thread qui traite la connexion avec le client :
 

Code :
  1. while(watchdog.isAlive())
  2.         {
  3.             Object received=new Object();
  4.             received = this.entree.readObject();
  5.             System.out.println("lecture du message de la socket" );
  6.             if(received instanceof Message)
  7.                 initStatut((Message) received);
  8.                 ...


 
Ensuite je fais un writeObject dans le threadserveur vers le client
sortie.writeObject(...);
 
 
Du coté client on a :
 

Code :
  1. public void reception() throws Exception{
  2.       boolean continu=true;
  3.       Message recu;
  4.       Object received;
  5.        try{
  6.          while(continu)
  7.          {
  8.                 recu = new Message();
  9.                 received=new Object();
  10.                 received = this.entree.readObject();
  11.            
  12.                 if(received instanceof Message)
  13.                 {
  14.                             recu = ((Message) received);
  15.                             System.out.println("MESSAGE RECU" );
  16.                             if ((recu.getText()).equals("q" ))
  17.                                 {
  18.                                     continu=false;
  19.                                     affichage.append("Au revoir" );
  20.                                 }
  21.                             else                           
  22.                                 affichage.append((recu.getText()).toString());                         
  23.                 }                 
  24.                 else                   
  25.                         if(received instanceof Statut_con)
  26.                         {       System.out.println("WATCHDOG RECU" );
  27.                                 PingPong(new Statut_con());
  28.                         }
  29.             }
  30.        } catch(Exception e){
  31.                             e.printStackTrace();
  32.                             System.out.println("erreur READSOCKET" );
  33.                             }
  34.    }


 
et ensuite la méthode PingPong renvoit une réponse dans le cas ou un message de type watchdog à été recu par le client :
 

Code :
  1. public void PingPong(Statut_con stat) throws Exception
  2.     {
  3.         try
  4.         { 
  5.             sortie.writeObject(stat);
  6.             sortie.flush();   
  7.         }
  8.         catch(java.lang.Exception ioe)
  9.         {       
  10.             throw new Exception("Error while ping ponging" );
  11.         }
  12.     }


 
De retour du coté threadserveur, on recupere le pingpong du client :

Code :
  1. else
  2.                 if(received instanceof Statut_con)
  3.                    watchdog.interrupt();


 
Donc le watchdog est interrompu et ca recommence. Sachant qu'entre temps on a des messages qui circulent sur la socket entre le serveur et le client.
 
A la compil pas de problemes, et a l'execution coté client on a :

Code :
  1. MESSAGE RECU
  2. WATCHDOG RECU
  3. java.net.SocketException: Connection reset
  4.         at java.net.SocketInputStream.read(SocketInputStream.java:168)
  5.         at java.net.SocketInputStream.read(SocketInputStream.java:182)
  6.         at java.io.ObjectInputStream$PeekInputStream.peek(ObjectInputStream.java:2133)
  7.         at java.io.ObjectInputStream$BlockDataInputStream.peek(ObjectInputStream.java:2423)
  8.         at java.io.ObjectInputStream$BlockDataInputStream.peekByte(ObjectInputStream.java:2433)
  9.         at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1245)
  10.         at java.io.ObjectInputStream.readObject(ObjectInputStream.java:324)
  11.         at ClientGraph.reception(ClientGraph.java:140)
  12.         at ClientGraph.main(ClientGraph.java:99)
  13. erreur READSOCKET
  14. la connexion est fermee


 
Il faut savoir que le programme tourne tres bien sans le watchdog, donc s'agit-il d'une erreur de synchronization de trames (aucun synchronized n'est présent dans le programme) ou bien une erreur a la con comme on sait si bien les faire.
 
merci a ceux qui peuvent me filer un coup de main,
si vous avez besoin de plus de precisions n'hesitez pas...
 
Giansolo

mood
Publicité
Posté le   profilanswer
 


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

  [Sockets] question sur les sockets ....

 

Sujets relatifs
Question programmation sous dream.Question C++ (Modélisation
Question peut être connequestion bouton radio
Question sur traitement de données ACCESSQuestion from a noob : difference entre "->" et "." ?
Ptite question toute bete !! (HTML, boutons, formulaire..)Question de débutant.....
[HTML] Question taille tableauUne question sur une procédure
Plus de sujets relatifs à : [Sockets] question sur les sockets ....


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