Hvordan håndtere Java SocketException

1. Introduksjon

I denne raske opplæringen lærer vi årsakene til SocketException med et eksempel.

Vi vil selvfølgelig også diskutere hvordan vi kan håndtere unntaket.

2. Årsaker til SocketException

Den vanligste årsaken til SocketException skriver eller leser data til eller fra en lukket stikkontakt. En annen årsak til det er å lukke forbindelsen før du leser alle data i stikkontaktbufferen.

La oss se nærmere på noen vanlige underliggende årsaker.

2.1. Sakte nettverk

En dårlig nettverkstilkobling kan være det underliggende problemet. Hvis du angir en timeout for tilkobling med høyere sokkel, kan du redusere frekvensen på SocketException for langsomme tilkoblinger:

socket.setSoTimeout (30000); // tidsavbrudd satt til 30 000 ms

2.2. Brannmurintervensjon

En nettverksbrannmur kan lukke stikkontakter. Hvis vi har tilgang til brannmuren, kan vi slå den av og se om den løser problemet.

Ellers kan vi bruke et nettverksovervåkingsverktøy som Wireshark for å sjekke brannmuraktiviteter.

2.3. Lang inaktiv tilkobling

Tomkoblinger kan bli glemt av den andre enden (for å spare ressurser). Hvis vi må bruke en forbindelse i lang tid, kan vi sende hjerterytmemeldinger for å forhindre inaktiv tilstand.

2.4. Programfeil

Sist men ikke minst, SocketException kan oppstå på grunn av feil eller feil i koden vår.

For å demonstrere dette, la oss starte en server på port 6699:

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

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

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

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

out.println ("hei"); i. lukk (); ut. lukk (); clientSocket.close (); serverSocket.close ();

La oss si at en klient kobler seg til serveren vår og sender “hei”:

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

Så langt så bra.

Men hvis klienten sender en ny melding:

client.sendMessage ("hei igjen");

Siden klienten sender "Hei igjen" til serveren etter at forbindelsen er avbrutt, a SocketException inntreffer.

3. Håndtering av a SocketException

Håndtering SocketException er ganske enkelt og greit. I likhet med ethvert annet kontrollert unntak, må vi enten kaste den eller omgi den med en prøvefangstblokk.

La oss håndtere unntaket i vårt eksempel:

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

Her har vi stengt klientforbindelsen etterunntaket skjedde. Forsøk vil ikke fungere, fordi forbindelsen allerede er stengt. Vi bør starte en ny forbindelse i stedet:

client.startConnection ("127.0.0.1", 6699); client.sendMessage ("hei igjen");

4. Konklusjon

I denne artikkelen så vi på hva som forårsaket det SocketException og hvordan du skal håndtere det.

Som alltid er koden tilgjengelig på Github.


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