Kako se rukuje Java SocketExceptionom

1. Uvod

U ovom brzom vodiču naučit ćemo uzroke SocketException s primjerom.

Također ćemo, naravno, razgovarati o tome kako postupati s iznimkom.

2. Uzroci SocketException

Najčešći uzrok SocketException je upisivanje ili čitanje podataka u ili iz zatvorene utičnice. Drugi uzrok tome je prekid veze prije čitanja svih podataka u međuspremniku utičnice.

Pogledajmo bliže neke uobičajene temeljne razloge.

2.1. Spora mreža

Loš mrežni priključak mogao bi biti osnovni problem. Postavljanje većeg vremena čekanja veze utičnice može smanjiti stopu SocketException za spore veze:

socket.setSoTimeout (30000); // vremensko ograničenje postavljeno na 30 000 ms

2.2. Intervencija vatrozida

Mrežni vatrozid može zatvoriti veze utičnice. Ako imamo pristup vatrozidu, možemo ga isključiti i vidjeti hoće li riješiti problem.

U suprotnom, možemo koristiti alat za nadzor mreže kao što je Wireshark za provjeru aktivnosti vatrozida.

2.3. Duga veza u praznom hodu

Neaktivne veze možda će zaboraviti drugi kraj (radi uštede resursa). Ako vezu moramo upotrebljavati dulje vrijeme, možemo slati poruke otkucaja srca kako bismo spriječili stanje mirovanja.

2.4. Greška u aplikaciji

Posljednje, ali ne najmanje važno, SocketException može nastati zbog pogrešaka ili grešaka u našem kodu.

Da to pokažemo, pokrenimo poslužitelj na portu 6699:

SocketServer poslužitelj = novi SocketServer (); server.start (6699);

Kad se poslužitelj pokrene, pričekat ćemo poruku klijenta:

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

Jednom kad ga dobijemo, odgovorit ćemo i zatvoriti vezu:

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

Dakle, recimo da se klijent poveže s našim poslužiteljem i pošalje "hi":

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

Zasada je dobro.

Ali, ako klijent pošalje drugu poruku:

client.sendMessage ("zdravo opet");

Budući da klijent šalje "bok opet" na poslužitelj nakon prekida veze, a SocketException javlja se.

3. Rukovanje a SocketException

Rukovanje SocketException je prilično lako i jednostavno. Slično bilo kojoj drugoj provjerenoj iznimci, moramo je ili baciti ili okružiti blokom try-catch.

Obradimo iznimku u našem primjeru:

isprobajte {client.sendMessage ("hi"); client.sendMessage ("zdravo opet"); } catch (SocketException e) {client.stopConnection (); }

Evo, nakon toga smo zatvorili vezu s klijentomdogodila se iznimka. Ponovni pokušaj neće uspjeti jer je veza već zatvorena. Umjesto toga trebali bismo uspostaviti novu vezu:

client.startConnection ("127.0.0.1", 6699); client.sendMessage ("zdravo opet");

4. Zaključak

U ovom smo članku pogledali uzroke SocketException i kako to riješiti.

Kao i uvijek, kôd je dostupan na Githubu.