מציאת יציאה חופשית בג'אווה

1. סקירה כללית

בעת הפעלת שרת שקעים ביישום Java שלנו, ה- java.net API מחייב אותנו לציין מספר יציאה חופשי להאזנה. מספר היציאה נדרש כדי ששכבת TCP תוכל לזהות את היישום שמיועד הנתונים הנכנסים אליו.

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

במדריך מהיר זה, נבדוק כיצד לבדוק מצב יציאה ספציפי וכיצד להשתמש במערכת שהוקצה אוטומטית. נבדוק כיצד ניתן לעשות זאת בעזרת Java ו- Spring. אנו נסתכל גם על כמה יישומי שרתים אחרים, כמו Tomcat ו- Jetty מוטבעים.

2. בדיקת מצב הנמל

בואו נסתכל כיצד נוכל לבדוק אם יציאה ספציפית פנויה או תפוסה באמצעות ה- java.net ממשק API.

2.1. סנמל ספציפי

נשתמש ב- ServerSocket כיתה מה java.net ממשק API ליצירת שקע שרת, מאוגד ליציאה שצוינה. בבנאי שלה, ה ServerSocket מקבל מספר יציאה מפורש. השיעור מיישם גם את סגור ממשק, כך שניתן להשתמש בו ב נסה עם משאבים כדי לסגור את השקע באופן אוטומטי ולפנות את היציאה:

נסה (ServerSocket serverSocket = ServerSocket חדש (FREE_PORT_NUMBER)) {assertThat (serverSocket) .isNotNull (); assertThat (serverSocket.getLocalPort ()). isEqualTo (FREE_PORT_NUMBER); } לתפוס (IOException e) {fail ("יציאה אינה זמינה"); }

במקרה שאנחנו משתמשים ביציאה ספציפית פעמיים, או שהיא כבר תפוסה על ידי יישום אחר, ה- ServerSocket בונה יזרוק IOException:

נסה (ServerSocket serverSocket = ServerSocket חדש (FREE_PORT_NUMBER)) {ServerSocket חדש (FREE_PORT_NUMBER); fail ("לא ניתן להשתמש באותה יציאה פעמיים"); } לתפוס (IOException e) {assertThat (e) .hasMessageContaining ("הכתובת כבר בשימוש"); }

2.2. פאורט טווח

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

עבור (int port: FREE_PORT_RANGE) {try (ServerSocket serverSocket = ServerSocket new (port)) {assertThat (serverSocket) .isNotNull (); assertThat (serverSocket.getLocalPort ()). isEqualTo (יציאה); לַחֲזוֹר; } לתפוס (IOException e) {assertThat (e) .hasMessageContaining ("הכתובת כבר בשימוש"); }} נכשל ("לא נמצאה יציאה חופשית בטווח");

3. מציאה נמל חופשי

השימוש במספר יציאה מפורש הוא לא תמיד אפשרות טובה, אז בואו נבדוק אפשרויות להקצות יציאה חופשית באופן אוטומטי.

3.1. Java רגיל

אנו יכולים להשתמש במספר יציאה מיוחד באפס ServerSocket בונה כיתתי. כתוצאה מכך, java.net API יקצה לנו אוטומטית יציאה בחינם:

נסה (ServerSocket serverSocket = ServerSocket חדש (0)) {assertThat (serverSocket) .isNotNull (); assertThat (serverSocket.getLocalPort ()). isGreaterThan (0); } לתפוס (IOException e) {fail ("יציאה אינה זמינה"); }

3.2. מסגרת האביב

מסגרת האביב מכילה א SocketUtils בכיתה בה נוכל למצוא יציאה חופשית זמינה. היישום הפנימי שלה משתמש ב- ServerSocket כיתה, כפי שמוצג בדוגמאות הקודמות שלנו:

יציאת int = SocketUtils.findAvailableTcpPort (); נסה (ServerSocket serverSocket = ServerSocket חדש (יציאה)) {assertThat (serverSocket) .isNotNull (); assertThat (serverSocket.getLocalPort ()). isEqualTo (יציאה); } לתפוס (IOException e) {fail ("יציאה אינה זמינה"); }

4. יישומי שרת אחרים

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

4.1. מֵזַח

Jetty הוא שרת מוטבע פופולרי מאוד ליישומי Java. היא תקצה לנו אוטומטית יציאה בחינם אלא אם כן הגדרנו אותה במפורש באמצעות setPort שיטת ה- מחבר שרת מעמד:

שרת jettyServer = שרת חדש (); ServerConnector serverConnector = ServerConnector חדש (jettyServer); jettyServer.addConnector (serverConnector); נסה את {jettyServer.start (); assertThat (serverConnector.getLocalPort ()). isGreaterThan (0); } לתפוס (חריג e) {fail ("נכשלה הפעלת שרת המזח"); } סוף סוף {jettyServer.stop (); jettyServer.destroy (); }

4.2. טומקט

Tomcat, שרת פופולרי נוסף המוטמע ב- Java, עובד קצת אחרת. אנו יכולים לציין מספר יציאה מפורש באמצעות ה- setPort שיטת ה- טומקט מעמד. במקרה שאנו מספקים מספר יציאה אפס, Tomcat יקצה אוטומטית יציאה בחינם. עם זאת, אם לא נקבע מספר יציאה כלשהו, ​​Tomcat ישתמש ביציאת ברירת המחדל 8080. שים לב שיציאת Tomcat המוגדרת כברירת מחדל עשויה להיות תפוסה על ידי יישומים אחרים:

Tomcat tomcatServer = Tomcat חדש (); tomcatServer.setPort (0); נסה את {tomcatServer.start (); assertThat (tomcatServer.getConnector (). getLocalPort ()). isGreaterThan (0); } לתפוס (LifecycleException e) {fail ("נכשלה הפעלת שרת Tomcat"); } סוף סוף {tomcatServer.stop (); tomcatServer.destroy (); }

5. מסקנה

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

בדוגמאות כיסינו את הבסיס ServerSocket כיתה מה java.net ממשק API ויישומי שרתים פופולריים אחרים, כולל Jetty ו- Tomcat.

כמו תמיד, קוד המקור השלם זמין ב- GitHub.


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