מדריך ל- UDP בג'אווה

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

במאמר זה נחקור תקשורת רשת עם Java באמצעות פרוטוקול User Datagram (UDP).

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

רוב התקשורת באינטרנט מתבצעת באמצעות פרוטוקול בקרת השידור (TCP), אולם ל- UDP יש את מקומה אותו נחקור בסעיף הבא.

2. מדוע להשתמש ב- UDP?

UDP שונה למדי מה- TCP הנפוץ יותר. אך לפני שנשקול את החסרונות ברמת השטח של UDP, חשוב להבין שחוסר התקורה יכול להפוך אותו למהיר משמעותית מ- TCP.

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

3. בניית יישומי UDP

בניית יישומי UDP דומה מאוד לבניית מערכת TCP; ההבדל היחיד הוא שאנחנו לא יוצרים חיבור נקודה לנקודה בין לקוח לשרת.

ההתקנה היא גם פשוטה מאוד. Java נשלחת עם תמיכה מובנית ברשת עבור UDP - שהיא חלק מה- java.net חֲבִילָה. לכן כדי לבצע פעולות רשת באמצעות UDP, עלינו רק לייבא את המחלקות מה- java.net חֲבִילָה: java.net.DatagramSocket ו java.net.DatagramPacket.

בסעיפים הבאים נלמד כיצד לעצב יישומים המתקשרים באמצעות UDP; נשתמש בפרוטוקול ההד הנפוץ ליישום זה.

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

4. השרת

בתקשורת UDP, הודעה אחת נעטפת ב- DatagramPacket אשר נשלח דרך א DatagramSocket.

נתחיל בהקמת שרת פשוט:

מחלקה ציבורית EchoServer מרחיב אשכול {שקע DatagramSocket פרטי; ריצה בוליאנית פרטית; בתים פרטיים [] buf = בתים חדשים [256]; EchoServer ציבורי () {socket = DatagramSocket חדש (4445); } הפעלה בטלנית ציבורית () {running = true; תוך כדי (ריצה) {DatagramPacket packet = DatagramPacket חדש (buf, buf.length); שקע.קבל (חבילה); כתובת InetAddress = packet.getAddress (); יציאת int = packet.getPort (); packet = DatagramPacket חדש (buf, buf.length, כתובת, port); מחרוזת שהתקבלה = מחרוזת חדשה (packet.getData (), 0, packet.getLength ()); אם (received.equals ("סוף")) {running = false; לְהַמשִׁיך; } socket.send (חבילה); } socket.close (); }}

אנו יוצרים גלובלי DatagramSocket בהן נשתמש לאורך כל הדרך כדי לשלוח מנות, מערך בתים לעטוף את ההודעות שלנו ומשתנה סטטוס שנקרא רץ.

לשם פשטות השרת מתרחב פְּתִילכדי שנוכל ליישם הכל בתוך לָרוּץ שיטה.

בְּתוֹך לָרוּץ, אנו יוצרים לולאת זמן שרק פועלת עד רץ משתנה לשקר על ידי שגיאה כלשהי או הודעת סיום מהלקוח.

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

לאחר מכן, אנו קוראים לְקַבֵּל שיטה על השקע. שיטה זו נחסמת עד שמגיעה הודעה והיא מאחסנת את ההודעה בתוך מערך הבייט של ה- DatagramPacket עבר אליו.

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

חזור.

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

5. הלקוח

עכשיו בואו נשיק לקוח פשוט לשרת חדש זה:

מחלקה ציבורית EchoClient {שקע DatagramSocket פרטי; כתובת פרטית של InetAddress; בתים פרטיים [] buf; EchoClient ציבורי () {socket = DatagramSocket חדש (); address = InetAddress.getByName ("localhost"); } מחרוזת ציבורית sendEcho (מחרוזת msg) {buf = msg.getBytes (); DatagramPacket מנות = DatagramPacket חדש (buf, buf.length, כתובת, 4445); socket.send (חבילה); packet = DatagramPacket חדש (buf, buf.length); שקע.קבל (חבילה); מחרוזת שהתקבלה = מחרוזת חדשה (packet.getData (), 0, packet.getLength ()); תשואה שהתקבלה; } ריק ריק () {socket.close (); }}

הקוד לא כל כך שונה מזה של השרת. יש לנו את הגלובלית שלנו DatagramSocket וכתובת השרת. אנו מיישרים את אלה בתוך הקונסטרוקטור.

יש לנו שיטה נפרדת אשר שולחת הודעות לשרת ומחזירה את התגובה.

תחילה אנו ממירים את הודעת המחרוזת למערך בתים, ואז יוצרים a DatagramPacket למשלוח הודעות.

הבא - אנו שולחים את ההודעה. אנחנו מיד ממירים את DatagramPacket למקבל.

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

6. המבחן

בשיעור UDPTest.java, אנו פשוט יוצרים בדיקה אחת לבדיקת יכולת ההדהוד של שני היישומים שלנו:

לקוח UDPTest {EchoClient לקהל ציבורי; @ לפני התקנת החלל הציבורי () {EchoServer חדש (). התחל (); לקוח = EchoClient חדש (); } @Test הציבור בטל כאשר CanSendAndReceivePacket_thenCorrect () {מחרוזת הד = client.sendEcho ("שלום שרת"); assertEquals ("שלום שרת", הד); הד = client.sendEcho ("השרת עובד"); assertFalse (echo.equals ("שלום שרת")); } @ לאחר ביטול פומבי של דמעה () {client.sendEcho ("סוף"); client.close (); }}

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

7. מסקנה

במאמר זה למדנו על פרוטוקול User Datagram ובנינו בהצלחה יישומי שרת לקוח משלנו שמתקשרים באמצעות UDP.

לקבלת קוד מקור מלא עבור הדוגמאות המשמשות במאמר זה, תוכל לבדוק את פרויקט GitHub.