Ako zaobchádzať s Java SocketException

1. Úvod

V tomto rýchlom návode sa dozvieme príčiny SocketException s príkladom.

Samozrejme tiež prediskutujeme, ako zvládnuť výnimku.

2. Príčiny SocketException

Najbežnejšia príčina SocketException je zápis alebo čítanie údajov do alebo z uzavretého soketového spojenia. Ďalšou príčinou je ukončenie spojenia pred načítaním všetkých údajov vo vyrovnávacej pamäti soketu.

Pozrime sa podrobnejšie na niektoré bežné základné dôvody.

2.1. Pomalá sieť

Základným problémom môže byť zlé sieťové pripojenie. Nastavenie vyššieho časového limitu pre pripojenie soketu môže znížiť rýchlosť SocketException pre pomalé pripojenia:

socket.setSoTimeout (30000); // časový limit nastavený na 30 000 ms

2.2. Zásah firewallom

Sieťový firewall môže ukončiť soketové pripojenia. Ak máme prístup k bráne firewall, môžeme ju vypnúť a zistiť, či problém vyrieši.

V opačnom prípade môžeme na kontrolu aktivít brány firewall použiť nástroj na sledovanie siete, napríklad Wireshark.

2.3. Dlhé nečinné pripojenie

Nečinné pripojenia môžu byť druhým koncom zabudnuté (kvôli šetreniu zdrojov). Ak musíme pripojenie používať dlhší čas, môžeme posielať správy so srdcovým rytmom, aby sme zabránili nečinnému stavu.

2.4. Chyba aplikácie

V neposlednom rade, SocketException sa môžu vyskytnúť z dôvodu chýb alebo chýb v našom kóde.

Aby sme to demonštrovali, spustíme server na porte 6699:

Server SocketServer = nový SocketServer (); server.start (6699);

Po spustení servera počkáme na správu od klienta:

serverSocket = nový ServerSocket (port); clientSocket = serverSocket.accept (); out = new PrintWriter (clientSocket.getOutputStream (), true); in = new BufferedReader (nový InputStreamReader (clientSocket.getInputStream ())); Reťazec msg = in.readLine ();

Akonáhle to dostaneme, odpovieme a ukončíme spojenie:

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

Povedzme, že sa klient pripojí k nášmu serveru a odošle „ahoj“:

Klient SocketClient = nový SocketClient (); client.startConnection ("127.0.0.1", 6699); client.sendMessage ("ahoj");

Zatiaľ je všetko dobré.

Ak však klient pošle ďalšiu správu:

client.sendMessage ("opäť ahoj");

Keďže klient pošle "ešte raz Ahoj" po prerušení spojenia na server, a SocketException vyskytuje.

3. Zaobchádzanie s a SocketException

Manipulácia SocketException je dosť ľahké a priame. Podobne ako v prípade akejkoľvek inej skontrolovanej výnimky, musíme ju buď vyhodiť, alebo obklopiť blokom try-catch.

Urobme výnimku v našom príklade:

try {client.sendMessage ("ahoj"); client.sendMessage ("opäť ahoj"); } catch (SocketException e) {client.stopConnection (); }

Tu sme ukončili pripojenie klienta ponastala výnimka. Nový pokus nebude fungovať, pretože pripojenie je už uzavreté. Namiesto toho by sme mali vytvoriť nové pripojenie:

client.startConnection ("127.0.0.1", 6699); client.sendMessage ("opäť ahoj");

4. Záver

V tomto článku sme sa pozreli na to, čo spôsobuje SocketException a ako to zvládnuť.

Ako vždy, kód je k dispozícii na stránkach Github.


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