pb pour détecter une coupure sur la liaison tcp/ip
2 réponses
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
Cette action est irreversible, confirmez la suppression du commentaire ?
Signaler le commentaire
Veuillez sélectionner un problème
Nudité
Violence
Harcèlement
Fraude
Vente illégale
Discours haineux
Terrorisme
Autre
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.
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.
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.
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 !!
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 !!
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 !!