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.