Comment gérer Java SocketException

1. Introduction

Dans ce tutoriel rapide, nous allons apprendre les causes de SocketException avec un exemple.

Nous discuterons également, bien sûr, de la manière de gérer l'exception.

2. Causes de SocketException

La cause la plus courante de SocketException est l'écriture ou la lecture de données vers ou depuis une connexion socket fermée. Une autre cause en est la fermeture de la connexion avant de lire toutes les données dans le tampon de socket.

Examinons de plus près certaines raisons sous-jacentes courantes.

2.1. Réseau lent

Une mauvaise connexion réseau peut être le problème sous-jacent. La définition d'un délai d'expiration de connexion socket plus élevé peut réduire le taux de SocketException pour les connexions lentes:

socket.setSoTimeout(30000); // timeout set to 30,000 ms

2.2. Intervention du pare-feu

Un pare-feu réseau peut fermer les connexions socket. Si nous avons accès au pare-feu, nous pouvons le désactiver et voir s'il résout le problème.

Sinon, nous pouvons utiliser un outil de surveillance du réseau tel que Wireshark pour vérifier les activités du pare-feu.

2.3. Longue connexion inactive

Les connexions inactives peuvent être oubliées par l'autre extrémité (pour économiser des ressources). Si nous devons utiliser une connexion pendant une longue période, nous pouvons envoyer des messages de pulsation pour éviter l'état d'inactivité.

2.4. Erreur d'application

Enfin, SocketException peut se produire en raison d'erreurs ou de bogues dans notre code.

Pour illustrer cela, démarrons un serveur sur le port 6699:

SocketServer server = new SocketServer(); server.start(6699);

Lorsque le serveur est démarré, nous attendrons un message du client:

serverSocket = new ServerSocket(port); clientSocket = serverSocket.accept(); out = new PrintWriter(clientSocket.getOutputStream(), true); in = new BufferedReader(new InputStreamReader(clientSocket.getInputStream())); String msg = in.readLine();

Une fois que nous l'obtenons, nous répondrons et fermerons la connexion:

out.println("hi"); in.close(); out.close(); clientSocket.close(); serverSocket.close();

Alors, disons qu'un client se connecte à notre serveur et envoie «salut»:

SocketClient client = new SocketClient(); client.startConnection("127.0.0.1", 6699); client.sendMessage("hi");

Jusqu'ici tout va bien.

Mais, si le client envoie un autre message:

client.sendMessage("hi again");

Étant donné que le client envoie à nouveau «salut» au serveur après l' interruption de la connexion, une SocketException se produit.

3. Gestion d'une exception SocketException

La gestion de SocketException est assez simple et directe. Semblable à toute autre exception vérifiée, nous devons soit la lancer, soit l'entourer d'un bloc try-catch.

Traitons l'exception dans notre exemple:

try { client.sendMessage("hi"); client.sendMessage("hi again"); } catch (SocketException e) { client.stopConnection(); }

Ici, nous avons fermé la connexion client aprèsl'exception s'est produite. Une nouvelle tentative ne fonctionnera pas, car la connexion est déjà fermée. Nous devrions plutôt démarrer une nouvelle connexion:

client.startConnection("127.0.0.1", 6699); client.sendMessage("hi again");

4. Conclusion

Dans cet article, nous avons examiné les causes de SocketException et comment le gérer.

Comme toujours, le code est disponible sur Github.