BufferedReader en attente pendant lecture socket[Resolu]

BufferedReader en attente pendant lecture socket[Resolu] - Java - Programmation

Marsh Posté le 12-11-2005 à 11:18:18    

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
Reply

Marsh Posté le 12-11-2005 à 11:18:18   

Reply

Marsh Posté le 12-11-2005 à 15:20:25    

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
Reply

Marsh Posté le 12-11-2005 à 15:25:44    

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
Reply

Marsh Posté le 12-11-2005 à 16:33:28    

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
Reply

Marsh Posté le 12-11-2005 à 16:35:59    

[: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
Reply

Marsh Posté le 12-11-2005 à 16:40:09    

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
Reply

Marsh Posté le 12-11-2005 à 17:44:07    

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]

Reply

Marsh Posté le 12-11-2005 à 17:55:47    

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
Reply

Sujets relatifs:

Leave a Replay

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