Umgang mit Java SocketException

1. Einleitung

In diesem kurzen Tutorial lernen wir die Ursachen von SocketException anhand eines Beispiels kennen.

Wir werden natürlich auch diskutieren, wie mit der Ausnahme umgegangen werden soll.

2. Ursachen der SocketException

Die häufigste Ursache für SocketException ist das Schreiben oder Lesen von Daten in oder aus einer geschlossenen Socket-Verbindung. Eine weitere Ursache ist das Schließen der Verbindung, bevor alle Daten im Socket-Puffer gelesen werden.

Schauen wir uns einige häufig zugrunde liegende Gründe genauer an.

2.1. Langsames Netzwerk

Eine schlechte Netzwerkverbindung könnte das zugrunde liegende Problem sein. Durch Festlegen eines höheren Zeitlimits für Socket-Verbindungen kann die SocketException- Rate für langsame Verbindungen verringert werden :

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

2.2. Firewall-Intervention

Eine Netzwerk-Firewall kann Socket-Verbindungen schließen. Wenn wir Zugriff auf die Firewall haben, können wir sie deaktivieren und prüfen, ob das Problem dadurch behoben wird.

Andernfalls können wir ein Netzwerküberwachungstool wie Wireshark verwenden, um die Firewall-Aktivitäten zu überprüfen.

2.3. Lange Leerlaufverbindung

Inaktive Verbindungen werden möglicherweise am anderen Ende vergessen (um Ressourcen zu sparen). Wenn wir längere Zeit eine Verbindung verwenden müssen, können wir Heartbeat-Nachrichten senden, um den Ruhezustand zu verhindern.

2.4. Anwendungsfehler

Last but not least kann SocketException aufgrund von Fehlern oder Fehlern in unserem Code auftreten.

Um dies zu demonstrieren, starten wir einen Server an Port 6699:

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

Wenn der Server gestartet wird, warten wir auf eine Nachricht vom 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();

Sobald wir es erhalten haben, werden wir antworten und die Verbindung schließen:

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

Nehmen wir also an, ein Client stellt eine Verbindung zu unserem Server her und sendet "Hallo":

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

So weit, ist es gut.

Wenn der Client jedoch eine andere Nachricht sendet:

client.sendMessage("hi again");

Da der Client nach dem Abbrechen der Verbindung erneut "Hallo" an den Server sendet, tritt eine SocketException auf.

3. Behandlung einer SocketException

Die Handhabung von SocketException ist ziemlich einfach und unkompliziert. Ähnlich wie bei jeder anderen aktivierten Ausnahme müssen wir sie entweder auslösen oder mit einem Try-Catch-Block umgeben.

Lassen Sie uns die Ausnahme in unserem Beispiel behandeln:

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

Hier haben wir die Client-Verbindung nach geschlossenDie Ausnahme ist aufgetreten. Ein erneuter Versuch funktioniert nicht, da die Verbindung bereits geschlossen ist. Wir sollten stattdessen eine neue Verbindung herstellen:

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

4. Fazit

In diesem Artikel haben wir uns angesehen, was SocketException verursacht und wie damit umgegangen wird.

Wie immer ist der Code auf Github verfügbar.