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

  FORUM HardWare.fr
  Programmation
  Java

  BufferedReader en attente pendant lecture socket[Resolu]

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

BufferedReader en attente pendant lecture socket[Resolu]

n°1244174
esox_ch
Posté le 12-11-2005 à 11:18:18  profilanswer
 

Bonjour,
 
Etant donné que ça fait un moment que je n'ai plus fait d'appli Java pour mon compte, j'ai décidé de me lancer dans un petit logiciel client/serveur à usage personnel.
Cependant j'ai un problème qui est très probablement tres simple mais que j'arrive pas a resoudre .
 
Le code de mon petit serveur  
 

Code :
  1. import java.net.ServerSocket;
  2. import java.net.Socket;
  3. import java.net.InetAddress;
  4. import java.io.IOException;
  5. import java.io.BufferedReader;
  6. import java.io.InputStreamReader;
  7. import java.io.InputStream;
  8. public class Listener {
  9.     public static void main(String[] args) {
  10.         if (args[0].equals("start" )) {
  11.             try {
  12.                 ServerSocket ss;
  13.                 Socket s;
  14.                 ss = new ServerSocket(7777, 0, InetAddress.getLocalHost());
  15.                 String st;
  16.                 while (true) {
  17.                     s = ss.accept();
  18.                     s.setKeepAlive(true);
  19.                     InputStream is = s.getInputStream();
  20.                     BufferedReader br = new BufferedReader(new InputStreamReader(is));
  21.                     st = br.readLine();
  22.                     if (st != null) {
  23.                         System.out.println(st);
  24.                     } else {
  25.                         System.out.println("Waiting" );
  26.                     }
  27.                 }
  28.             } catch (IOException e) {
  29.                 System.out.println("Erreur d'initialisation" );
  30.             }
  31.         }
  32.     }
  33. }


 
Le problème se situe au niveau du readline. Quand un client se connecte et envoie qqch en utilisant :
 

Code :
  1. Socket s = new Socket(paramsConnection.getServer(), paramsConnection.getPort());
  2. OutputStream os = s.getOutputStream();
  3. OutputStreamWriter ow = new OutputStreamWriter(os);
  4. ow.write("d: Data" );
  5. ow.flush();


 
Le serveur detecte la connection (il passe outre le accept) mais arrivé au readline il bloque et attend quelquechose.
 
Que dois-je faire? J'ai pensé à separer ça en plusieurs threads mais je vois pas tres bien ce que ça m'apporterais d'avoir un thread qui attend je ne sais quoi pendant que celui principal revient au ss.accept();
 
Je m'excuse d'avance pour la nature extrement simple de la question, mais tout les exemples que j'ai pu voir sur le net utilisent un systeme proche du mien, donc je comprend pas pourquoi le mien bloque.
 
Merci d'avance

Message cité 1 fois
Message édité par esox_ch le 12-11-2005 à 16:33:45

---------------
Si la vérité est découverte par quelqu'un d'autre,elle perd toujours un peu d'attrait
mood
Publicité
Posté le 12-11-2005 à 11:18:18  profilanswer
 

n°1244293
TheRom_S
Posté le 12-11-2005 à 15:20:25  profilanswer
 

tu devrais sortir le accept de ton while car tu n'as pas besoin de rouvrir un socket à chaque fois
ensuite, tu peux effectivement mettre ton readLine dans un thread séparé si il bloque l'execution d'autres parties de ton code
readLine est toujours bloquant


---------------
The Rom's, à votre service
n°1244294
masklinn
í dag viðrar vel til loftárása
Posté le 12-11-2005 à 15:25:44  profilanswer
 

esox_ch a écrit :

Le serveur detecte la connection (il passe outre le accept) mais arrivé au readline il bloque et attend quelquechose.


Naïvement, je dirais que si ton serveur attends une ligne (readline) et que le client n'envoie pas une ligne (pas de writeline, et ta chaîne ne se termine pas par \r\n) le serveur attendra jusqu'à avoir sa fin de ligne :o


---------------
Stick a parrot in a Call of Duty lobby, and you're gonna get a racist parrot. — Cody
n°1244328
esox_ch
Posté le 12-11-2005 à 16:33:28  profilanswer
 

Résultat des courses, la solution était aussi "stupide" que la question. Et je te remercie masklinn pour l'avoir apportée. Le problème était tout simplement le \r\n qui manquait, tout le reste roule. Et effectivmeent j'ai sorti le ss.accept et le setKeepActive du while. Je les avais mis dedans pour ecarter un probleme de fermeture de socket pour une raison y ou x qui m'echappait mais c'est clair que niveau perf c'est mieux quand ça reste dehors.  
 
En tous cas merci beaucoup


---------------
Si la vérité est découverte par quelqu'un d'autre,elle perd toujours un peu d'attrait
n°1244330
masklinn
í dag viðrar vel til loftárása
Posté le 12-11-2005 à 16:35:59  profilanswer
 

[:kbchris]
 
(j'ai pas dit stupide hein, mais bon l'absence de parallèle entre les opérations de lecture et d'écriture ça aurait quand même dû te choquer :o)
 
(BTW, normalement en java tu peux balancer directement des objets à travers tes sockets en utilisant les streams kivonbien, ça peut servir :o)


---------------
Stick a parrot in a Call of Duty lobby, and you're gonna get a racist parrot. — Cody
n°1244332
esox_ch
Posté le 12-11-2005 à 16:40:09  profilanswer
 

Non c'est moi qui ai dit stupide :D.
 
Et effectivement je suis passé a coté sur ce coup ..
 
Merci en tous cas [:kbchris]


---------------
Si la vérité est découverte par quelqu'un d'autre,elle perd toujours un peu d'attrait
n°1244353
vb11
Posté le 12-11-2005 à 17:44:07  profilanswer
 

Il n'y a rien de stupide à proposer des solutions concrètes, la seule choses stupide pour moi dans ce forum, c'est les grandes gueules qui te disent "t'a qu'à lire la doc", ou bien "c'est pas comme ça qu'on fait" ( sans aucune explication ) ... tout se discute en java....
[Coup de gueule off]

n°1244355
esox_ch
Posté le 12-11-2005 à 17:55:47  profilanswer
 

Disons qu'en general ce genre de réponse suit une question qui a déjà été posée plusieurs (dizaines de) fois. Dans mon cas c'est pas une question qui a deja été posée tres souvent (bienque Taz en avait plus ou moins parlé dans un topic sur un probleme de socket en java) et dans la doc c'est pas specifiquement expliqué ... Mais c'est vrai qu'en reflechissant un peu mieux j'aurais pu trouver :). En tout cas comme ça maintenant c'est dit et si qqn tombe sur le meme probleme, un coup de recherche et la solution est la ;)


---------------
Si la vérité est découverte par quelqu'un d'autre,elle perd toujours un peu d'attrait

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

  BufferedReader en attente pendant lecture socket[Resolu]

 

Sujets relatifs
Récupérer l'état d'une socket en sortie d'un select()[Merise] Notion d'inclusion, lecture d'un schéma.
[resolu] xml et namespace[CSS] - Probleme double marge IE : position:absolute [résolu]
warning gcc [Résolu][MACRO excel / resolu ] creation d hyperliens amenant a des feuillets
[ECLIPSE] ClearCase plugin->> Probleme Résolu[VBS] (résolu) copy overwrite fonctionne pas.. pourquoi?
[VBA-EXCEL 2003][resolu] suppression des feuilles contenant le motlecture code
Plus de sujets relatifs à : BufferedReader en attente pendant lecture socket[Resolu]


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