Omgaan met Java SocketException

1. Inleiding

In deze korte tutorial leren we de oorzaken van SocketException met een voorbeeld.

We bespreken natuurlijk ook hoe we met de uitzondering kunnen omgaan.

2. Oorzaken van SocketException

De meest voorkomende oorzaak van SocketException schrijft of leest gegevens van of naar een gesloten socketverbinding. Een andere oorzaak hiervan is het verbreken van de verbinding voordat alle gegevens in de socketbuffer zijn gelezen.

Laten we enkele veelvoorkomende onderliggende redenen eens nader bekijken.

2.1. Langzaam netwerk

Een slechte netwerkverbinding kan het onderliggende probleem zijn. Als u een hogere time-out voor socketverbinding instelt, kan de snelheid van SocketException voor langzame verbindingen:

socket.setSoTimeout (30000); // time-out ingesteld op 30.000 ms

2.2. Firewall-interventie

Een netwerkfirewall kan socketverbindingen sluiten. Als we toegang hebben tot de firewall, kunnen we deze uitschakelen en kijken of het het probleem oplost.

Anders kunnen we een netwerkmonitoringstool zoals Wireshark gebruiken om firewallactiviteiten te controleren.

2.3. Lange inactieve verbinding

Inactieve verbindingen kunnen aan de andere kant worden vergeten (om bronnen te besparen). Als we lange tijd een verbinding moeten gebruiken, kunnen we heartbeat-berichten verzenden om inactiviteit te voorkomen.

2.4. Applicatiefout

Tenslotte, SocketException kan optreden vanwege fouten of bugs in onze code.

Om dit te demonstreren, starten we een server op poort 6699:

SocketServer-server = nieuwe SocketServer (); server.start (6699);

Wanneer de server is gestart, wachten we op een bericht van de client:

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

Zodra we het hebben, we zullen reageren en de verbinding verbreken:

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

Dus, laten we zeggen dat een client verbinding maakt met onze server en "hallo" stuurt:

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

Tot nu toe zo goed.

Maar als de klant nog een bericht stuurt:

client.sendMessage ("hallo weer");

Omdat de klant verzendt "Hallo weer" naar de server nadat de verbinding is verbroken, een SocketException treedt op.

3. Behandeling van een SocketException

Afhandeling SocketException is vrij eenvoudig en duidelijk. Net als bij elke andere gecontroleerde uitzondering, moeten we deze ofwel gooien of omringen met een try-catch-blok.

Laten we de uitzondering in ons voorbeeld afhandelen:

probeer {client.sendMessage ("hi"); client.sendMessage ("hallo weer"); } catch (SocketException e) {client.stopConnection (); }

Hier hebben we de clientverbinding daarna geslotende uitzondering deed zich voor. Opnieuw proberen werkt niet, omdat de verbinding al is verbroken. We zouden in plaats daarvan een nieuwe verbinding moeten starten:

client.startConnection ("127.0.0.1", 6699); client.sendMessage ("hallo weer");

4. Conclusie

In dit artikel hebben we gekeken naar wat de oorzaken zijn SocketException en hoe ermee om te gaan.

Zoals altijd is de code beschikbaar op Github.