probleme de socket (communication client/serveur)

probleme de socket (communication client/serveur) - Java - Programmation

Marsh Posté le 17-12-2002 à 19:02:56    

Salut,
 
j'ai un probleme, j'utilise des socket pour communiquer, la premiere communication se passe bien (login et password), ensuite la deuxieme communication coince, la socket lis bien les bytes, mais veut continuer a lire alors qu'il y a plus rien (et j'ai fais ca dans un try catch (EOFException))
 
client :
 

Code :
  1. // phase de login
  2. cliSock = new Socket(host,8256);
  3.                 System.err.println(cliSock.getInetAddress().toString());
  4.                 dos = new DataOutputStream(cliSock.getOutputStream());
  5.                 dis = new DataInputStream(cliSock.getInputStream());
  6. dos.writeUTF(login);
  7. dos.flush();
  8. String reponse = dis.readUTF();
  9. // deuxieme phase (envoie de texte) c'est a partir d'ici que ca foire
  10. dos.write(texte); //texte est un tableau de byte
  11. dos.flush();


 
le server :  
 

Code :
  1. SocketEcoute = new ServerSocket(PortEcouteUrg);
  2. SocketService = SocketEcoute.accept();
  3.          
  4. dis = new DataInputStream(new BufferedInputStream(SocketService.getInputStream()));
  5. dos = new DataOutputStream(new BufferedOutputStream(SocketService.getOutputStream()));
  6.            
  7. String login = dis.readUTF();
  8. dos.writeUTF(reponse);
  9. dos.flush();
  10. // jusqu'ici tout est ok
  11. // ici ca foire, ca lis les bytes envoyes puis quand yen a plus, ca ne passe pas dans l'exception, comme si il y avait des bytes "fantomes"...
  12. try
  13. {
  14.   while (true)
  15.   {
  16.         byte b;
  17.         b = dis.readByte();
  18.    }
  19. }
  20. catch (EOFException e)
  21. {
  22. ...
  23. }


 
si quelqu'un peut m'aider, ca me serait bien utile, merci

Reply

Marsh Posté le 17-12-2002 à 19:02:56   

Reply

Marsh Posté le 17-12-2002 à 19:50:23    

attebd, quand tu fais read, il se met en attente d'éléments à lire. Donc si tu lui envoie plus rien, c'est normal que ca bloque. Je vois pas pourquoi une exception serait générée ...
 
Si tu veux dire au serveur d'arrêter de lire, il faut soit que tu fermes la socket (là une exception sera générée sur le serveur), soit que tu définisses dans ton protocole réseau un message "stop" qui dira au serveur d'arrêter de lire.

Reply

Marsh Posté le 17-12-2002 à 19:57:21    

cette exception est generee quand ya plus de byte a lire, c'est fait expres!!! la suite du code se trouvera dans le catch
et je ne sais pas combien de byte je vais lire car le message est crypte, donc oblige de faire comme ca...
 
public class EOFException
extends IOException
Signals that an end of file or end of stream has been reached unexpectedly during input.  
 
This exception is mainly used by data input streams to signal end of stream. Note that many other input operations return a special value on end of stream rather than throwing an exception.


Message édité par Slash- le 17-12-2002 à 19:58:23
Reply

Marsh Posté le 17-12-2002 à 19:59:23    

:pfff:  
et quand est-ce qu'il y a plus de byte à lire ????
ben quand tu fermes la socket !
 
comment veux tu que le serveur sache que le client a finit d'envoyer ses données sinon ?  :sarcastic:

Reply

Marsh Posté le 17-12-2002 à 20:05:28    

ton appli server ne sert qu'un seul client ?

Reply

Marsh Posté le 17-12-2002 à 20:08:51    

HappyHarry a écrit :

ton appli server ne sert qu'un seul client ?


je crois que le serveur multi-threadé ce sera dans une 2e étape ... ;)

Reply

Marsh Posté le 17-12-2002 à 20:09:59    

benou a écrit :


je crois que le serveur multi-threadé ce sera dans une 2e étape ... ;)


 
;)

Reply

Marsh Posté le 17-12-2002 à 21:06:13    

Slash- a écrit :

Salut,
 
j'ai un probleme, j'utilise des socket pour communiquer, la premiere communication se passe bien (login et password), ensuite la deuxieme communication coince, la socket lis bien les bytes, mais veut continuer a lire alors qu'il y a plus rien (et j'ai fais ca dans un try catch (EOFException))
 
 


 
C'est un problème de BSD (enfin d'OS quoi), tu as le fonctionnement par défaut des socket, le mode bloquant. Tu peux la passer en mode non bloquant et là ça aura le comportement que tu veux.
 
Tiens, j'ai trouvé :  
http://java.sun.com/j2se/1.4.1/doc [...] Blocking()
 
ServerSocket.getChannel().configureBlocking(false);
 
ou un truc du genre.
 
 

Reply

Marsh Posté le 17-12-2002 à 21:24:01    

bon c'est vrai que ca fonctionne si je ferme la socket, mais si je dois faire une autre communication apres, je dois reouvrir une socket alors ...
 
ya pas une methode qui pourrait lire d'un flux (dataouputstream dans mon cas) des bytes mais sans savoir combien de bytes doivent etre lus?
 
ps : qu'un seul client oui, pas de multithread pour le moment en tout cas ;)


Message édité par Slash- le 17-12-2002 à 21:24:49
Reply

Marsh Posté le 17-12-2002 à 21:44:37    

comme je te dis depuis tout à l'heure, il faut que tu te créée un protocole réseau !
il faut que tu définisses la forme des donénes qui seront échangés entre ton client et ton serveur pour que chacun sache comment réagir aux données qu'il reçoit.

Reply

Sujets relatifs:

Leave a Replay

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