6 votes

Reconnexion d'une connexion de socket Java sur déconnexion

J'ai un code Java qui établit une connexion socket à long terme avec un dispositif de domotique pour en surveiller l'activité/les événements. Le problème est que si l'appareil est redémarré ou mis hors tension, le code Java doit se reconnecter automatiquement dès que possible. Avez-vous une idée de la manière de détecter une interruption de connexion du côté Java, de préférence sans interroger périodiquement le dispositif ?

3voto

Eddie Points 27755

Si le dispositif redémarre sans fermer correctement la prise, je ne connais rien qui vous permette de le détecter. Votre serveur ne pourra pas détecter que le socket a disparu, dans ce cas, à moins que le périphérique ne se remette en marche ou que la pile TCP/IP de votre serveur n'abandonne et déclare que la connexion est morte. À un moment donné, vous obtiendrez un IOException. Vous devez attraper cette exception et vous reconnecter lorsqu'elle se produit.

Vous êtes vraiment à la merci du comportement de TCP/IP ici. Lorsqu'une extrémité d'une connexion disparaît tout simplement (pas d'interruption de la connexion), il n'y a pas de problème. FIN ), l'autre extrémité peut attendre un temps arbitraire (dépendant de nombreux facteurs) avant de décider que la connexion est morte.

Si vous voulez détecter ce problème plus tôt, et si vous pouvez garantir que le périphérique répondra dans un délai déterminé, définissez un délai d'attente sur le socket. Si vous faites cela, vous obtiendrez un message de type SocketTimeoutException si le périphérique ne répond pas, et vous pouvez alors fermer la prise et essayer de la rouvrir. J'ai utilisé cette méthode avec succès.

2voto

Reginaldo Points 534

Si votre logiciel n'attend que les données du dispositif domotique, le seul moyen de détecter que le dispositif est parti est d'activer l'option SO_KEEPALIVE dans le socket ouvert pour communiquer avec le dispositif.

Pour ce faire, il suffit d'appeler la méthode setKeepAlive(true) sur la socket et cela fera en sorte que l'implémentation de la socket sous-jacente active l'option SO_KEEP_ALIVE.

Ainsi, l'implémentation sous-jacente échangera périodiquement des données avec le point de terminaison distant. Si le périphérique meurt pendant que vous attendez des données, une exception sera levée.

Le seul problème est que ce délai de maintien en vie dépend du système d'exploitation et ne peut parfois pas être modifié.

Si vous avez besoin de délais plus courts, il n'y a pas d'autre moyen que d'implémenter une sonde périodique sur le dispositif.

1voto

GregHaki Points 11

J'ai résolu exactement le même problème.

Si vous voulez détecter ce problème plus tôt, et si vous pouvez garantir que le périphérique répondra dans un délai déterminé, définissez un délai d'attente sur le socket. Si vous faites cela, vous obtiendrez une SocketTimeoutException si le périphérique ne répond pas, et vous pourrez alors fermer le socket et essayer de le rouvrir. J'ai utilisé cette méthode avec succès.

Cité ci-dessus :

J'obtiens qu'il ferme la prise puis tente de r ce code. Le seul problème est qu'une fois que j'ai fermé un socket, je ne peux pas le réouvrir. je ne peux pas le rouvrir, je reçois l'exception que le socket est fermé. [ ] Cela se produit à chaque fois. Comment puis-je fermer un socket et le rouvrir sans obtenir cette exception ? sans obtenir cette exception ?

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X