Stopper l'éxécution aprés un certain temps

sephirothweb

Habitué
Bonjour, je cherche à faire discuter une interface JAVA avec un serveur que j'ai développé en C.

Quand mon interface JAVA envoie une requête à mon serveur C, elle attend une réponse de sa part.

Le serveur C doit faire un certain traitement suivant la requête et retourné la réponse à l'interface JAVA.

Le soucis c'est qu'il peut arriver que mon serveur C ne revoie rien, ce qui fait que mon interface JAVA est toujours en attente de la réponse du serveur C, ce qui me frezze mon interface.

Ce que j'aimerais donc faire est que lorsque je veut récupérer le message de mon serveur C, si la fonction permettant de lire le retour su serveur C prends plus de 2 secondes à s'éxécuter, je l'interrompt. Si elle met moins de 2 seconds, alors pas de soucis, j'aurai la réponse de la part de mon serveur C.

J'ai regardé parmis les classes Threads et Timer, mais je ne voit pas quelque chose qui correspond à mon cas :
- Soit il s'agit d'action se répétant (ce qui n'est pas mon cas)
- Soit Avec la méthode join de Thrad, on va forcément attendre les 2 secondes, alors que cela est juste pour éviter qu'une requête dur trop longtemps.

Pour résumérer mon probléme, on pourrait dire que si au bout de 2 secondes une fonction n'à pas fini de s'éxécuté, je la stoppe. Mais si elle se termine avant les 2 secondes, je récupére son retour.

J'espére avoir été clair. N'hésité pas à me poser des questions si vous ne comprenez pas.
 

sephirothweb

Habitué
Oui via un socket. C'est pour cela que lorsque mon client java (l'interface) attend un message du serveur C (avec un readline), il se fige (puisque aucun retour). J'aimerai avoir quelque chose qui dise "timeout connection exceeded".
J'espére avoir été clair
 

batchy

Grand Maître
ben y a normalement une fonction non bloquante pour les sockets. dans certains langages y a même une option ''timeout'' ...
 

sephirothweb

Habitué
Le truc c'est qur ma fonction doit être bloquante, car elle attend un message du serveur par rapport à une question. Je ne peut pas faire de traitement sans cette réponse. C'est pourquoi, j'aimerais que si cette réponse n'arrive pas au bout d'un temps de disons 5 secondes, j'affiche un message comme quoi il y'a eu une erreur de connexion ou autre ....
 

KangOl

Grand Maître
http://java.sun.com/j2se/1.4.2/docs/api/java/net/Socket.html#setSoTimeout(int)
 

sephirothweb

Habitué
Ca m'a l'air pas mal ça, j'aurais du penser que la classe Socket avait quelque chose permettant de le gérer. Je vais essayer en fin de semaine, aprés mes examens, je vous tient au courant.
Encore merci
 

_yann_

Habitué
Problème de conception.
Pourquoi ne pas renvoyer une valeur nulle depuis le serveur ?
 

KangOl

Grand Maître
otan pour moi :o

dans ce cas effectivement le timeout doit etre implémenter coté serveur ...
 

_yann_

Habitué
Implémenter le timeout sur le serveur est une idée en effet.
Mais on peut gagner du temps sur le timeout :
Je reformule le problème :
- l'appli en Java attend une réponse du serveur.
- le serveur renvoie une réponse ou RIEN. C'est là qu'il y a un problème de conception à mon avis. Le serveur devrait renvoyer une réponse quoi qu'il arrive.
Le serveur fait son traitement, si il y n'a pas de "solution" à ce traitement alors le serveur renvoie un false ou autre valeur arbitraire.
 

sephirothweb

Habitué
Le probléme est bien résolu avec le timeout.
J'ai bien pensé que le serveur C pouvait retourné une valeur lorsqu'il y'avait un probléme avec un SIGALRM par exemple si la requête prend trop de temps.
Mais on travaille à plusieurs sur le projet, et la personne en charge du serveur C n'à pas l'air trés motivé pour faire un SIGALRM sur la socket si la requête ne donne rien.
En fait, il y'a d'autres paramétres qui font que cette fonction était trés utile.
Merci pour votre aide
 
Vous devez vous inscrire ou vous connecter pour répondre ici.
Derniers messages publiés
Statistiques globales
Discussions
730 135
Messages
6 718 109
Membres
1 586 397
Dernier membre
Chachabidou
Partager cette page
Haut