A Java SocketException kezelése

1. Bemutatkozás

Ebben a gyors bemutatóban megtudhatjuk a kiváltó okokat SocketException példával.

Természetesen megvitatjuk a kivétel kezelésének módját is.

2. okai SocketException

A leggyakoribb oka SocketException adatok írása vagy olvasása zárt socket csatlakozásra vagy onnan. Egy másik oka a kapcsolat bezárása, mielőtt a socket pufferben lévő összes adatot elolvassa.

Vizsgáljuk meg közelebbről néhány gyakori mögöttes okot.

2.1. Lassú hálózat

A gyenge hálózati kapcsolat lehet a mögöttes probléma. Nagyobb socket csatlakozási időtúllépés beállítása csökkentheti a sebességet SocketException lassú kapcsolatok esetén:

socket.setSoTimeout (30000); // időtúllépés beállítása 30 000 ms

2.2. Tűzfal beavatkozás

A hálózati tűzfal bezárhatja a socket kapcsolatokat. Ha hozzáférünk a tűzfalhoz, kikapcsolhatjuk, és megnézhetjük, megoldja-e a problémát.

Ellenkező esetben használhatunk egy hálózati megfigyelő eszközt, például a Wireshark-ot a tűzfal tevékenységeinek ellenőrzésére.

2.3. Hosszú üresjárati kapcsolat

A tétlen kapcsolatokat elfelejtheti a másik vég (az erőforrások megtakarítása érdekében). Ha sokáig kell használnunk egy kapcsolatot, akkor szívritmusüzeneteket küldhetünk a tétlen állapot megakadályozása érdekében.

2.4. Alkalmazás hiba

Végül, de nem utolsó sorban, SocketException kódunk hibái vagy hibái miatt fordulhatnak elő.

Ennek bemutatásához indítsunk el egy szervert a 6699 porton:

SocketServer server = új SocketServer (); server.start (6699);

A kiszolgáló indításakor megvárjuk az ügyfél üzenetét:

serverSocket = új ServerSocket (port); clientSocket = serverSocket.accept (); out = new PrintWriter (clientSocket.getOutputStream (), true); in = new BufferedReader (új InputStreamReader (clientSocket.getInputStream ())); String msg = in.readLine ();

Amint megkapjuk, válaszolunk és lezárjuk a kapcsolatot:

out.println ("szia"); körülkerít(); out.close (); clientSocket.close (); serverSocket.close ();

Tehát tegyük fel, hogy egy kliens csatlakozik a szerverünkhöz és "szia" -t küld:

SocketClient kliens = új SocketClient (); client.startConnection ("127.0.0.1", 6699); client.sendMessage ("szia");

Eddig jó.

De ha az ügyfél újabb üzenetet küld:

client.sendMessage ("sziasztok még egyszer");

Mivel az ügyfél küld "Szia újra" a szerverhez a kapcsolat megszakítása után, a SocketException bekövetkezik.

3. Az a kezelése SocketException

Kezelése SocketException nagyon egyszerű és egyértelmű. A többi bejelölt kivételhez hasonlóan vagy dobnunk kell, vagy körbevennünk egy try-catch blokkkal.

Kezeljük a kivételt a példánkban:

próbáld ki az {client.sendMessage ("szia"); client.sendMessage ("sziasztok még egyszer"); } catch (SocketException e) {client.stopConnection (); }

Itt bezártuk az ügyfélkapcsolatota kivétel bekövetkezett. Az újrapróbálkozás nem fog menni, mert a kapcsolat már zárva van. Helyette új kapcsolatot kell indítanunk:

client.startConnection ("127.0.0.1", 6699); client.sendMessage ("sziasztok még egyszer");

4. Következtetés

Ebben a cikkben megnéztük, mi okozza SocketException és hogyan kell kezelni.

Mint mindig, a kód elérhető a Githubon.