Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

pb pour détecter une coupure sur la liaison tcp/ip

2 réponses
Avatar
Jean-Marie
bonjour

j'ai une application cliente qui se connecte à une application serveur
et lui envoie des trames données (le serveur lui n'envoie rien);
si au cours de l'envoi des données la liaison réseau est coupée ou si le
serveur ne fonctionne plus, je m'aperçois que je peux toujours envoyer
les données sans qu'il y ait un évènement qui m'avertisse du pb

le code est simple :
1-ouverture socket :
Socket socket=new Socket (InetAddress ,port);
2-création buffer d'écriture :
PrintWriter pw=new PrintWriter (new OutputStreamWriter
(socket.getOutputStream (),"ISO-8859-1"),true)
3-pour chaque donnée à écrire :
if (!socket.isClosed() && socket.isConnected()) {
pw.write(mess); // envoie d'une trame
pw.flush();
}
le test (!socket.isClosed() && socket.isConnected()) apparemment
est toujours vrai même si la liaison côté client est coupé
et le write ne génère pas d'exception

ce comportement est-il normal ?

comme nous ne voulons pas instaurer un contrôle de liaison
entre le serveur et le client, je ne vois pas d'autre solution
que d'ouvrir le socket et de le fermer pour chaque envoie
de trame ; dans ce cas effectivement la tentative d'ouverture du socket
génèrera une exception si le serveur n'est pas atteignable

merci pour vos remarques

Jean-Marie

2 réponses

Avatar
Eric Razny
Le Wed, 21 Mar 2007 11:56:18 +0100, Jean-Marie a écrit :

bonjour

j'ai une application cliente qui se connecte à une application serveur
et lui envoie des trames données (le serveur lui n'envoie rien);
si au cours de l'envoi des données la liaison réseau est coupée ou si le
serveur ne fonctionne plus, je m'aperçois que je peux toujours envoyer
les données sans qu'il y ait un évènement qui m'avertisse du pb


[snap]

comme nous ne voulons pas instaurer un contrôle de liaison
entre le serveur et le client, je ne vois pas d'autre solution
que d'ouvrir le socket et de le fermer pour chaque envoie
de trame ; dans ce cas effectivement la tentative d'ouverture du socket
génèrera une exception si le serveur n'est pas atteignable


Suivant la façon dont ton serveur est sensé fonctionner, la gestion des
timeout (connect, setSoTimeout & co) des sockets ne te suffirait pas? Si
timeout on suppose que la connexion est naze.

Avatar
Jean-Marie

bonjour

j'ai une application cliente qui se connecte à une application serveur
et lui envoie des trames données (le serveur lui n'envoie rien);
si au cours de l'envoi des données la liaison réseau est coupée ou si le
serveur ne fonctionne plus, je m'aperçois que je peux toujours envoyer
les données sans qu'il y ait un évènement qui m'avertisse du pb


[snap]
snap ?


comme nous ne voulons pas instaurer un contrôle de liaison
entre le serveur et le client, je ne vois pas d'autre solution
que d'ouvrir le socket et de le fermer pour chaque envoie
de trame ; dans ce cas effectivement la tentative d'ouverture du socket
génèrera une exception si le serveur n'est pas atteignable


Suivant la façon dont ton serveur est sensé fonctionner, la gestion des
timeout (connect, setSoTimeout & co) des sockets ne te suffirait pas? Si
timeout on suppose que la connexion est naze.



le serveur ouvre un ServerSocket, attend une connexion puis boucle en

lecture :

serverSocket = new ServerSocket(_port,100);
clientSocket = serverSocket.accept();
in = new BufferedReader(new
InputStreamReader(clientSocket.getInputStream()));
// boucle infinie de lecture sur le socket
do {
// socket read
line=in.readLine();
System.out.println(line);
} while (line==line);
// socket close
clientSocket.close();
serverSocket.close();

remarque : le serveur ne doit rien envoyer ; c'est au client à détecter
un pb de liaison au moment où il écrit ; là est tout le pb !!