לקוח Java עבור API של WebSockets

1. הקדמה

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

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

כדי לפתור את הבעיה שצוינה לעיל, אנו זקוקים לפרוטוקול מבוסס-סטנדרטי, דו-כיווני ומלא דופלקס, שיכול לשמש גם את השרתים וגם את הלקוחות, וזה הוביל להכנסת ה- JSR 356 API - במאמר זה אנו אראה דוגמא לשימוש בו.

2. התקנה

בואו נכלול את תלות Spring WebSocket בפרויקט שלנו:

 org.springframework spring-websocket 5.2.2.RELEASE org.springframework spring-messaging 5.2.2.RELEASE 

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

3. STOMP

פרוטוקול העברת מסרים מונחי טקסט (STOMP) הוא פורמט חוט פשוט, הניתן לתפעול המאפשר ללקוח ולשרתים לתקשר כמעט עם כל מתווכי ההודעות. זוהי אלטרנטיבה ל- AMQP (Advanced Message Queuing Protocol) ו- JMS (Java Messaging Service).

STOMP מגדיר פרוטוקול ללקוח / שרת לתקשר באמצעות סמנטיקה להעברת הודעות. הסמנטיקה נמצאת על גבי ה- WebSockets ומגדירה מסגרות הממופות למסגרות WebSockets.

השימוש ב- STOMP נותן לנו את הגמישות לפתח לקוחות ושרתים בשפות תכנות שונות. בדוגמה הנוכחית הזו נשתמש ב- STOMP להעברת הודעות בין לקוח לשרת.

4. שרת WebSocket

תוכלו לקרוא עוד על בניית שרתי WebSocket במאמר זה.

5. לקוח WebSocket

כדי לתקשר עם שרת WebSocket, הלקוח צריך ליזום את חיבור WebSocket על ידי שליחת בקשת HTTP לשרת עם שדרוג הכותרת מוגדרת כראוי:

קבל ws: //websocket.example.com/ HTTP / 1.1 מקור: //example.com חיבור: שדרג מארח: websocket.example.com שדרוג: שקע רשת

שים לב שכתובות האתר של WebSocket משתמשים ws ו wss תוכניות, השנייה מסמלת WebSockets מאובטחים.

השרת מגיב בחזרה על ידי שליחת ה- שדרוג כותרת בתגובה אם תמיכה ב- WebSockets מופעלת.

HTTP / 1.1 101 לחיצת יד לפרוטוקול WebSocket תאריך: רביעי, 16 אוקטובר 2013 10:07:34 GMT חיבור: שדרוג שדרוג: WebSocket

לאחר השלמת תהליך זה (המכונה גם לחיצת יד WebSocket), חיבור ה- HTTP הראשוני מוחלף בחיבור WebSocket על גבי אותו חיבור TCP / IP שלאחריו כל אחד מהצדדים יכול לשתף נתונים.

חיבור זה בצד הלקוח יוזם על ידי WebSocketStompClient למשל.

5.1. ה WebSocketStompClient

כמתואר בסעיף 3, ראשית עלינו ליצור חיבור WebSocket וזה נעשה באמצעות WebSocketClient מעמד.

ה WebSocketClient ניתן להגדיר באמצעות:

  • StandardWebSocketClient מסופק על ידי כל יישום JSR-356 כמו Tyrus
  • JettyWebSocketClient מסופק על ידי ממשק ה- API המקורי של Jetty 9+
  • כל יישום של אביב WebSocketClient

אנחנו נשתמש StandardWebSocketClient, יישום של WebSocketClient בדוגמה שלנו:

לקוח WebSocketClient = StandardWebSocketClient חדש (); WebSocketStompClient stompClient = WebSocketStompClient חדש (לקוח); stompClient.setMessageConverter (חדש MappingJackson2MessageConverter ()); StompSessionHandler sessionHandler = MyStompSessionHandler חדש (); stompClient.connect (URL, sessionHandler); סורק חדש (System.in) .nextLine (); // לא לסגור מיד. 

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

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

אם לשרת שלנו יש תמיכה ב- SockJs, נוכל לשנות את הלקוח לשימוש SockJsClient במקום StandardWebSocketClient.

5.2. ה StompSessionHandler

אנחנו יכולים להשתמש ב- StompSession כדי להירשם כמנוי לנושא WebSocket. ניתן לעשות זאת על ידי יצירת מופע של StompSessionHandlerAdapter אשר בתורו מיישם את StompSessionHandler.

א StompSessionHandler מספק אירועי מחזור חיים להפעלת STOMP. האירועים כוללים התקשרות חוזרת עם סיום ההפעלה והודעות במקרה של כשלים.

ברגע שלקוח WebSocket מתחבר לנקודת הקצה, ה- StompSessionHandler מקבל הודעה ו afterConnected () השיטה נקראת במקום בו אנו משתמשים ב- StompSession כדי להירשם לנושא:

@ ביטול ציבורי בטל לאחר מחובר (סשן StompSession, StompHeaders מחובר כותרות) {session.subscribe ("/ נושא / הודעות", זה); session.send ("/ אפליקציה / צ'אט", getSampleMessage ()); } @Override public void handleFrame (StompHeaders headers, Object payload) {Message msg = (Message) מטען מטען; logger.info ("התקבל:" + msg.getText () + "מ:" + msg.getFrom ()); }

וודא כי שרת WebSocket פועל ומריץ את הלקוח, ההודעה תוצג במסוף:

INFO obwclient.MyStompSessionHandler - מושב חדש שהוקם: 53b993eb-7ad6-4470-dd80-c4cfdab7f2ba INFO obwclient.MyStompSessionHandler - מנויים / נושא / הודעות INFO obwclient.MyStompSessionHandler - הודעה נשלחה לשרת רשת היי!! מאת: ניקי 

6. מסקנה

במדריך מהיר זה, יישמנו לקוח מבוסס אינטרנט של SpringSocket.

ניתן למצוא את היישום המלא ב- GitHub.