כיצד לטפל ב- Java SocketException

1. הקדמה

במדריך מהיר זה נלמד את הסיבות ל SocketException עם דוגמא.

נדון, כמובן, כיצד לטפל בחריג.

2. גורם ל SocketException

הסיבה השכיחה ביותר ל SocketException הוא כותב או קורא נתונים לחיבור שקע סגור או ממנו. סיבה נוספת לכך היא סגירת החיבור לפני קריאת כל הנתונים במאגר השקעים.

בואו נסתכל מקרוב על כמה סיבות בסיסיות נפוצות.

2.1. רשת איטית

חיבור רשת לקוי עשוי להיות הבעיה הבסיסית. הגדרת פסק זמן לחיבור שקע גבוה יותר יכולה להפחית את קצב SocketException לחיבורים איטיים:

socket.setSoTimeout (30000); // פסק זמן מוגדר ל 30,000 אלפיות השנייה

2.2. התערבות חומת האש

חומת אש ברשת יכולה לסגור חיבורי שקעים. אם יש לנו גישה לחומת האש, נוכל לכבות אותה ולראות אם זה פותר את הבעיה.

אחרת, אנו יכולים להשתמש בכלי ניטור רשת כגון Wireshark לבדיקת פעילויות חומת האש.

2.3. חיבור סרק ארוך

קשרים סרק עשויים להישכח מהצד השני (כדי לחסוך במשאבים). אם נצטרך להשתמש בחיבור לאורך זמן, אנו יכולים לשלוח הודעות פעימות לב כדי למנוע מצב סרק.

2.4. שגיאת יישום

אחרון חביב, SocketException יכול להתרחש בגלל טעויות או באגים בקוד שלנו.

כדי להדגים זאת, בואו נתחיל שרת ביציאה 6699:

שרת SocketServer = SocketServer חדש (); server.start (6699);

עם הפעלת השרת נמתין להודעה מהלקוח:

serverSocket = ServerSocket חדש (יציאה); clientSocket = serverSocket.accept (); out = PrintWriter חדש (clientSocket.getOutputStream (), נכון); in = BufferedReader חדש (InputStreamReader חדש (clientSocket.getInputStream ())); מחרוזת msg = in.readLine ();

ברגע שנקבל את זה, אנו נגיב ונסגור את החיבור:

out.println ("היי"); בקרוב(); out.close (); clientSocket.close (); serverSocket.close ();

אז נניח שלקוח מתחבר לשרת שלנו ושולח "היי":

לקוח SocketClient = SocketClient חדש (); client.startConnection ("127.0.0.1", 6699); client.sendMessage ("היי");

בינתיים הכל טוב.

אבל אם הלקוח שולח הודעה נוספת:

client.sendMessage ("שלום שוב");

מאז הלקוח שולח "היי שוב" לשרת לאחר הפסקת החיבור, א SocketException מתרחשת.

3. טיפול בא SocketException

טיפול SocketException די קל ופשוט. בדומה לכל חריג מסומן אחר, עלינו לזרוק אותו או להקיף אותו בחסימת תפיסה.

בואו נתמודד עם החריג בדוגמה שלנו:

נסה את {client.sendMessage ("היי"); client.sendMessage ("שלום שוב"); } לתפוס (SocketException e) {client.stopConnection (); }

הנה, סגרנו את חיבור הלקוח לאחר מכןהחריג התרחש. ניסיון חוזר לא יעבוד מכיוון שהחיבור כבר נסגר. עלינו להתחיל חיבור חדש במקום:

client.startConnection ("127.0.0.1", 6699); client.sendMessage ("שלום שוב");

4. מסקנה

במאמר זה, הסתכלנו מה הגורמים לכך SocketException ואיך לטפל בזה.

כמו תמיד, הקוד זמין ב- Github.


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