[Sockets] question sur les sockets ....

question sur les sockets .... [Sockets] - Java - Programmation

Marsh Posté le 20-12-2004 à 21:41:15    

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

Reply

Marsh Posté le 20-12-2004 à 21:41:15   

Reply

Marsh Posté le 21-12-2004 à 11:04:32    

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
Reply

Marsh Posté le 21-12-2004 à 11:09:01    

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

Reply

Marsh Posté le 21-12-2004 à 11:33:54    

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

Reply

Marsh Posté le 21-12-2004 à 13:55:14    

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
Reply

Marsh Posté le 21-12-2004 à 14:09:03    

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!"
Reply

Marsh Posté le 21-12-2004 à 14:15:48    

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
Reply

Marsh Posté le 21-12-2004 à 14:17:42    

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
Reply

Marsh Posté le 21-12-2004 à 14:22:48    

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

Reply

Marsh Posté le 21-12-2004 à 14:25:37    

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!"
Reply

Marsh Posté le 21-12-2004 à 14:25:37   

Reply

Marsh Posté le 21-12-2004 à 14:29:16    

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
Reply

Marsh Posté le 21-12-2004 à 14:30:51    

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
Reply

Marsh Posté le 21-12-2004 à 14:33:30    

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

Reply

Marsh Posté le 22-12-2004 à 00:13:50    

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
Reply

Marsh Posté le 22-12-2004 à 11:14:27    

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

Reply

Marsh Posté le 22-12-2004 à 11:19:55    

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
Reply

Marsh Posté le 22-12-2004 à 11:25:18    

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
Reply

Marsh Posté le 22-12-2004 à 11:27:21    

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


---------------
ma vie, mon oeuvre - HomePlayer
Reply

Marsh Posté le 22-12-2004 à 11:29:52    

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

Reply

Marsh Posté le 22-12-2004 à 14:33:01    


[:yo]

Reply

Marsh Posté le 23-12-2004 à 15:31:46    

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

Reply

Marsh Posté le    

Reply

Sujets relatifs:

Leave a Replay

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