Sådan håndteres Java SocketException

1. Introduktion

I denne hurtige vejledning lærer vi årsagerne til SocketException med et eksempel.

Vi vil naturligvis også diskutere, hvordan man håndterer undtagelsen.

2. Årsager til SocketException

Den mest almindelige årsag til SocketException skriver eller læser data til eller fra en lukket stikforbindelse. En anden årsag til det er at lukke forbindelsen, før du læser alle data i socketbufferen.

Lad os se nærmere på nogle almindelige bagvedliggende årsager.

2.1. Langsomt netværk

En dårlig netværksforbindelse kan være det bagvedliggende problem. Indstilling af en timeout til højere stikforbindelse kan reducere hastigheden på SocketException til langsomme forbindelser:

socket.setSoTimeout (30000); // timeout indstillet til 30.000 ms

2.2. Firewall-intervention

En netværks firewall kan lukke stikket forbindelser. Hvis vi har adgang til firewallen, kan vi slukke for den og se, om den løser problemet.

Ellers kan vi bruge et netværksovervågningsværktøj såsom Wireshark til at kontrollere firewallaktiviteter.

2.3. Lang inaktiv forbindelse

Idle forbindelser bliver muligvis glemt af den anden ende (for at spare ressourcer). Hvis vi skal bruge en forbindelse i lang tid, kan vi sende hjerterytmemeddelelser for at forhindre inaktiv tilstand.

2.4. Program fejl

Sidst men ikke mindst, SocketException kan forekomme på grund af fejl eller fejl i vores kode.

Lad os starte en server på port 6699 for at demonstrere dette:

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

Når serveren startes, venter vi på en besked fra klienten:

serverSocket = ny ServerSocket (port); clientSocket = serverSocket.accept (); ud = ny PrintWriter (clientSocket.getOutputStream (), sand); i = ny BufferedReader (ny InputStreamReader (clientSocket.getInputStream ())); Streng msg = in.readLine ();

Når vi først har fået det, vi svarer og lukker forbindelsen:

out.println ("hej"); i. luk (); out.close (); clientSocket.close (); serverSocket.close ();

Så lad os sige, at en klient opretter forbindelse til vores server og sender "hej":

SocketClient-klient = ny SocketClient (); client.startConnection ("127.0.0.1", 6699); client.sendMessage ("hej");

Så langt så godt.

Men hvis klienten sender en anden besked:

client.sendMessage ("hej igen");

Da klienten sender "Hej igen" til serveren, efter at forbindelsen er afbrudt, a SocketException opstår.

3. Håndtering af en SocketException

Håndtering SocketException er ret let og ligetil. I lighed med enhver anden kontrolleret undtagelse skal vi enten smide den eller omgive den med en prøvefangstblok.

Lad os håndtere undtagelsen i vores eksempel:

prøv {client.sendMessage ("hej"); client.sendMessage ("hej igen"); } fange (SocketException e) {client.stopConnection (); }

Her har vi lukket klientforbindelsen efterundtagelsen opstod. Forsøg fungerer ikke igen, fordi forbindelsen allerede er lukket. Vi skal starte en ny forbindelse i stedet:

client.startConnection ("127.0.0.1", 6699); client.sendMessage ("hej igen");

4. Konklusion

I denne artikel har vi kigget på, hvad der forårsager det SocketException og hvordan man håndterer det.

Som altid er koden tilgængelig på Github.


$config[zx-auto] not found$config[zx-overlay] not found