[Java] Socket + Timeout + buffer en sortir

Socket + Timeout + buffer en sortir [Java] - Java - Programmation

Marsh Posté le 12-06-2002 à 15:33:35    

Yep,
 
La question est un peu bizarre mais si par chance quelqu'un a eu le même problème ...
 
J'ai un process qui envoie des requêtes sous forme XML et un autre process qui les récupère. Une communication classique via socket Java.
 
Le schéma est le suivant:
 
1. Server fonctionne
2. Le client démarre et ouvre une socket sur le server
3. Le client récupère un outputstream
4. Je fais un kill sur le serveur
5. Depuis mon client j'appelle
 
out.write(some bytes);
out.flush();
 
--> Aucune exception !!! (alors que clairement le serveur est down !!)
 
Ca vous inspire qqch?


---------------
Just because you feel good does not make you right
Reply

Marsh Posté le 12-06-2002 à 15:33:35   

Reply

Marsh Posté le 12-06-2002 à 15:56:23    

oh le vilain bide:)
 
(zut je retrouve pu l'image des chats :()

Reply

Marsh Posté le 12-06-2002 à 16:17:15    

:cry:


---------------
Just because you feel good does not make you right
Reply

Marsh Posté le 12-06-2002 à 16:55:32    

DarkLord a écrit a écrit :

 
Ca vous inspire qqch?  




 
ton outputstream, c'est pas un buffered au moins ?

Reply

Marsh Posté le 12-06-2002 à 17:05:42    

benou a écrit a écrit :

 
 
ton outputstream, c'est pas un buffered au moins ?  




c'était et je le flushais à chaque requete. Puis j'ai essayé avec un outputstream tout simple et ca a exactement le même effet.


---------------
Just because you feel good does not make you right
Reply

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

aucune exception ???  :heink:
logiquement une IOException devrait etre lancée, c bizarre ton affaire ...


Message édité par HappyHarry le 06-12-2002 à 17:11:31
Reply

Marsh Posté le 12-06-2002 à 17:10:08    

dingue hein !! En fait la raison c'est que c'est bufférisé au niveau du stack tcp/ip et qu'il faut attendre que le stack soit plein pour avoir une erreur.
 
Et comme j'envoie peu de données à la fois.


---------------
Just because you feel good does not make you right
Reply

Marsh Posté le 12-06-2002 à 17:12:22    

DarkLord a écrit a écrit :

dingue hein !! En fait la raison c'est que c'est bufférisé au niveau du stack tcp/ip et qu'il faut attendre que le stack soit plein pour avoir une erreur.
 
Et comme j'envoie peu de données à la fois.  




 
arf ok tu bufferises ... a ce moment la faut que tu reduises la taille du buffer sinon c ingérable ton histoire

Reply

Marsh Posté le 12-06-2002 à 17:20:41    

Bah....J'ai des bufferedReader, et ça marche, moi....
 
A comprends pas!!

Reply

Marsh Posté le 12-06-2002 à 17:23:11    

HappyHarry a écrit a écrit :

 
 
arf ok tu bufferises ... a ce moment la faut que tu reduises la taille du buffer sinon c ingérable ton histoire  




 
négatif. je ne bufférises pas. Chaque socket a un buffer dans la pile TCP/IP
 
--> Je ne peux pas gérer ca. Et meme en changeant les propriétés de la socket ca change rien :(


---------------
Just because you feel good does not make you right
Reply

Marsh Posté le 12-06-2002 à 17:23:11   

Reply

Marsh Posté le 12-06-2002 à 17:33:31    

C zarb, ton truc, franchement...A comprends pas!  
Faut que je fasse des essais!!

Reply

Marsh Posté le 12-06-2002 à 17:34:06    

gfive a écrit a écrit :

C zarb, ton truc, franchement...A comprends pas!  
Faut que je fasse des essais!!  




 
bin tu fais un bete serveur en Java, un bete client en java et normallement tu devrais avoir l'erreur comme moi.


---------------
Just because you feel good does not make you right
Reply

Marsh Posté le 12-06-2002 à 17:52:06    

Ah ouais!!  
 
 
Le client :  
 
 

Citation :


import java.net.*;
import java.io.*;
 
public class TestClient {
 
    public TestClient(String host, int port) {
 OutputStream out = null;
 String ping = new String("ping" );
 byte[] b = ping.getBytes();
 try {
     Socket so = new Socket(host, port);
     out = so.getOutputStream();
     while (true) {
  char c = (char) System.in.read();
  if (c == '0';) {
      System.out.println("Ping!" );
      out.write(b);
      out.flush();  
  }
     }
 } catch (Exception e) {
     e.printStackTrace(System.out);
 }
    }
 
    public static void main(String[] args) {
 new TestClient(args[0], Integer.parseInt(args[1]));
    }
}

 
 
 
Le serveur :  
 

Citation :


 
import java.net.*;
import java.io.*;
 
public class Test {
 
     
    public Test(int port) {
 try {
     ServerSocket server = new ServerSocket(port);
     while (true) {
  Socket s = server.accept();
  System.out.println("[Server] : got a client!" );
     }
 } catch (Exception e) {
     e.printStackTrace(System.out);
 }
    }
 
    public static void main(String[] args) {
 new Test(Integer.parseInt(args[0]));
    }
}

 
 
J'ai dû taper deux fois "0" pour avoir une exception...

Reply

Marsh Posté le 12-06-2002 à 17:53:09    

exactement le genre de problème que j'ai ..


---------------
Just because you feel good does not make you right
Reply

Marsh Posté le 12-06-2002 à 17:55:12    

g fait pas mal de reseau en java, et g jamais vu ce probleme  :??:

Reply

Marsh Posté le 12-06-2002 à 18:30:27    

mais bon, dark, si c'est du XML que tu envoies, les données sont assez grosses => le buffer IP sera pas assez gros pour te poser des problèmes ...  
pkoi ca te pose problème ?

Reply

Marsh Posté le 12-06-2002 à 18:32:18    

benou a écrit a écrit :

mais bon, dark, si c'est du XML que tu envoies, les données sont assez grosses => le buffer IP sera pas assez gros pour te poser des problèmes ...  
pkoi ca te pose problème ?  




 
bin si il est assez gros. En fait la première requete passe sans problème au niveau java (buffer du stack ip). La deuxième se crashe. Mais en attendant mon back end pense que la requete 1 a été envoyée, ce qui est plutôt bizarre ....


---------------
Just because you feel good does not make you right
Reply

Marsh Posté le 12-06-2002 à 18:39:46    

DarkLord a écrit a écrit :

 
 
bin si il est assez gros. En fait la première requete passe sans problème au niveau java (buffer du stack ip). La deuxième se crashe. Mais en attendant mon back end pense que la requete 1 a été envoyée, ce qui est plutôt bizarre ....  




[:darklord]
c'est étonnant que que le buffer du stack ip soit capable de garder une requête entière !!!!  
t'imagine la perte de perf que ca implique ? tant que c'est pas envoyé, t'es pas près d'avoir la réponse ...
 
je suis très très septique ...

Reply

Marsh Posté le 12-06-2002 à 18:48:18    

greg@freestarthu a écrit a écrit :

oh le vilain bide:)
 
(zut je retrouve pu l'image des chats :()  




 
http://very.free.free.fr/forum/bidecat.jpg

Reply

Marsh Posté le 12-06-2002 à 18:54:04    

veryfree a écrit a écrit :

 
 
http://very.free.free.fr/forum/bidecat.jpg  




:D

Reply

Marsh Posté le 12-06-2002 à 19:43:53    

gfive a écrit:
 

Citation :


Le client :  
...snip...
 
Le serveur :  
...snip...
 
J'ai dû taper deux fois "0" pour avoir une exception...


J'ai testé ces client et serveur.
J'ai lancé 2 clients et tapé '0' des tas de fois et ça ne fait rien de spécial à part me répondre ping!
 
Ensuite j'ai killé le serveur et boum au premierr 0 suivant :

Code :
  1. java.net.SocketException: Connection reset by peer: socket write error
  2.         at java.net.SocketOutputStream.socketWrite0(Native Method)
  3.         at java.net.SocketOutputStream.socketWrite(SocketOutputStream.java:92)
  4.         at java.net.SocketOutputStream.write(SocketOutputStream.java:114)
  5.         at TestClient.<init>(TestClient.java:17)
  6.         at TestClient.main(TestClient.java:27)


 
(avec jdk1.4).
 
Sinon Dark, tu ferais pas du multithread ?
Genre: tu killes ton serveur mais la socket est gérée par un thread qui continue de vivre ?
 
K.


Message édité par krosso le 06-12-2002 à 19:47:07
Reply

Marsh Posté le 12-06-2002 à 20:16:22    

veryfree a écrit a écrit :

 
 
http://very.free.free.fr/forum/bidecat.jpg  




merci !:-)


---------------
\^o^/ Libérez HotShot \^o^/
Reply

Marsh Posté le 13-06-2002 à 08:35:13    

krosso a écrit a écrit :

gfive a écrit:
 

Citation :


Le client :  
...snip...
 
Le serveur :  
...snip...
 
J'ai dû taper deux fois "0" pour avoir une exception...


J'ai testé ces client et serveur.
J'ai lancé 2 clients et tapé '0' des tas de fois et ça ne fait rien de spécial à part me répondre ping!
 
Ensuite j'ai killé le serveur et boum au premierr 0 suivant :

Code :
  1. java.net.SocketException: Connection reset by peer: socket write error
  2.         at java.net.SocketOutputStream.socketWrite0(Native Method)
  3.         at java.net.SocketOutputStream.socketWrite(SocketOutputStream.java:92)
  4.         at java.net.SocketOutputStream.write(SocketOutputStream.java:114)
  5.         at TestClient.<init>(TestClient.java:17)
  6.         at TestClient.main(TestClient.java:27)


 
(avec jdk1.4).
 
Sinon Dark, tu ferais pas du multithread ?
Genre: tu killes ton serveur mais la socket est gérée par un thread qui continue de vivre ?
 
K.  




 
 
Ouais, si tu envoies des tas de ping, ça crashera au premier que tu envoies après avoir killé le serveur.. Le problème se pose si tu killes le serveur sans avoir encore rien envoyé!

Reply

Marsh Posté le 13-06-2002 à 08:53:26    

gfive a écrit a écrit :

 
Ouais, si tu envoies des tas de ping, ça crashera au premier que tu envoies après avoir killé le serveur.. Le problème se pose si tu killes le serveur sans avoir encore rien envoyé!  




Ca change rien.
1. démarrage serveur
2. démarrage client (serveur dit "got a client!" )
3. kill serveur (ctrl+c)
4. côté client envoi "0", affichage de "ping!" et plonk Exception aussi sec!
Bin je n'arrive pas à reproduire votre truc.
J'essaierai avec un jdk1.3.
 
K.

Reply

Marsh Posté le 13-06-2002 à 08:59:00    

krosso a écrit a écrit :

 
J'essaierai avec un jdk1.3.




 
jdk1.3.1_01 : exactement identique

Reply

Marsh Posté le 13-06-2002 à 09:38:51    

Je crois comprendre le problème krosso
 
gfive >>> sous quel OS
krosso >>> sous quel OS  
 
vous allez vite comprendre pq :)


---------------
Just because you feel good does not make you right
Reply

Marsh Posté le 13-06-2002 à 09:41:58    

DarkLord a écrit a écrit :

Je crois comprendre le problème krosso
 
gfive >>> sous quel OS
krosso >>> sous quel OS  
 
vous allez vite comprendre pq :)  




 
at home: win xp home (pour les posts de hier soir)
at work: win 2000 prof (pour les posts de ce matin)

Reply

Marsh Posté le 13-06-2002 à 09:56:06    

je parie que gfive est sous linux. Pour info j'ai cette erreur là que sous linux. Sous zidows ca fonctionne sans problème.


---------------
Just because you feel good does not make you right
Reply

Marsh Posté le 13-06-2002 à 09:58:44    

DarkLord a écrit a écrit :

je parie que gfive est sous linux. Pour info j'ai cette erreur là que sous linux. Sous zidows ca fonctionne sans problème.  




Ca pourrait être l'explication en effet.
Je vais réveiller mon vieux 486 qui tourne avec une RH5.0, mais il est chez moi, donc pas avant ce soir vers 22h00...

Reply

Marsh Posté le 13-06-2002 à 09:59:14    

DarkLord a écrit a écrit :

je parie que gfive est sous linux. Pour info j'ai cette erreur là que sous linux. Sous zidows ca fonctionne sans problème.  




 
hier soir quand je t repondu sur MSN g testé sous nux aussi ...

Reply

Marsh Posté le 13-06-2002 à 10:07:08    

Bon, effectivement, je suis sous Linux..Par contre, avec mon serveur de chat, si je tue le serveur comme un gros porc (un kill sur le process, quoi) j'ai bien une déconnection immédiate côté client.
 
Le code du client :  

Citation :


   public void run() {
        String line;
        while (thread != null) {
            try {
                if ((line = reader.readLine()) != null) {
                    fireEvent(line);
                } else {
                    fireEvent(NetworkEvent.SERVERDIED);
                }
            } catch (IOException ioe) {
                fireEvent(NetworkEvent.SERVERDIED);
            }
            thread.yield();
        }  
    }  

 
 
où reader est un BufferedInputStream
 
En fait, l'évènement SERVERDIED est envoyé dans le cas où line == null.....
 
Ouala ouala...

Reply

Marsh Posté le 13-06-2002 à 10:07:38    

c'est dépendant. J'ai démarré le servur sous mon laptop Win2K et le client sur la machine linux en question. J'ai un "connection lost" dès que je ferme le serveur
 
---> Dépendant à l'OS et linux ne se comporte pas comme windows ce qui est assez intéressant à savoir !!!
 
A+


---------------
Just because you feel good does not make you right
Reply

Marsh Posté le 13-06-2002 à 10:08:13    

ceci dit, en production le serveur est sur une machine Windows donc moi ca m'arrange bien mais bon c'est une expérience non négligable qd on devra faire des serveurs sous linux.


---------------
Just because you feel good does not make you right
Reply

Marsh Posté le 13-06-2002 à 10:19:35    

DarkLord a écrit a écrit :

ceci dit, en production le serveur est sur une machine Windows donc moi ca m'arrange bien mais bon c'est une expérience non négligable qd on devra faire des serveurs sous linux.  




ouep. intéressnt à savoir. Mais je suis quand même très étonné ... t'as testé sur une autre machine linux ? c'est peut être une config space sur ta machine.

Reply

Marsh Posté le 13-06-2002 à 10:27:55    

benou a écrit a écrit :

 
ouep. intéressnt à savoir. Mais je suis quand même très étonné ... t'as testé sur une autre machine linux ? c'est peut être une config space sur ta machine.  




 
yaiss


---------------
Just because you feel good does not make you right
Reply

Marsh Posté le 13-06-2002 à 10:29:10    

benou a écrit a écrit :

 
ouep. intéressnt à savoir. Mais je suis quand même très étonné ... t'as testé sur une autre machine linux ? c'est peut être une config space sur ta machine.  




 
testé sur une RH 7.2 pour dark hier soir, meme comportement

Reply

Marsh Posté le 13-06-2002 à 10:30:13    

HappyHarry a écrit a écrit :

 
testé sur une RH 7.2 pour dark hier soir, meme comportement  




dingue ca ...

Reply

Marsh Posté le 13-06-2002 à 10:31:21    

benou a écrit a écrit :

 
dingue ca ...  




 
ouais mais d'un coté je suis super content d'avoir cette expérience en poche. Ca va m'être sans doute utile un jour ou l'autre.


---------------
Just because you feel good does not make you right
Reply

Marsh Posté le 13-06-2002 à 10:31:35    

benou a écrit a écrit :

 
dingue ca ...  




 
sans doute une histoire d'optimisation de la pile TCP de nux qui fait ca ...
si qq'un peut tester sur un BSD ou un Solaris ca serait bien

Reply

Marsh Posté le 13-06-2002 à 10:35:28    

HappyHarry a écrit a écrit :

 
 
sans doute une histoire d'optimisation de la pile TCP de nux qui fait ca ...
si qq'un peut tester sur un BSD ou un Solaris ca serait bien  




 
Ca y est!
J'ai enfin pu le reproduire sur une solaris 5.6:
505 - java -classpath . TestClient 127.0.0.1 6589
0
Ping!
0
Ping!
java.io.IOException: Broken pipe
        at java.net.SocketOutputStream.socketWrite(Native Method)
        at java.net.SocketOutputStream.write(SocketOutputStream.java:75)
        at TestClient.<init>(Compiled Code)
        at TestClient.main(TestClient.java:27)
[10:34:49]:[/xxxxxxxxx]:[]
506 - java -version
java version "1.2.1"
Solaris VM (build Solaris_JDK_1.2.1_02, native threads, sunwjit)


Message édité par krosso le 13-06-2002 à 10:36:07
Reply

Marsh Posté le    

Reply

Sujets relatifs:

Leave a Replay

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