Klien Java untuk WebSockets API

1. Perkenalan

HTTP (Hypertext Transfer Protocol) adalah protokol respons permintaan tanpa kewarganegaraan. Desainnya yang sederhana membuatnya sangat skalabel tetapi tidak sesuai dan tidak efisien untuk aplikasi web real-time yang sangat interaktif karena jumlah overhead yang perlu dikirimkan bersama dengan setiap permintaan / respons.

Karena HTTP itu sinkron dan aplikasi waktu nyata harus asinkron, solusi apa pun seperti polling atau long polling (Comet) cenderung rumit dan tidak efisien.

Untuk mengatasi masalah yang ditentukan di atas, kami memerlukan protokol berbasis standar, bi-directional dan full-duplex yang dapat digunakan oleh server dan klien, dan ini mengarah pada pengenalan API JSR 356 - dalam artikel ini, kami ' Saya akan menunjukkan contoh penggunaannya.

2. Penyiapan

Mari sertakan dependensi Spring WebSocket ke proyek kita:

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

Kami selalu bisa mendapatkan versi terbaru dari dependensi dari Maven Central untuk spring-websocket dan spring-messaging.

3. STOMP

Stream Text-Oriented Messaging Protocol (STOMP) adalah format kabel sederhana yang dapat dioperasikan yang memungkinkan klien dan server untuk berkomunikasi dengan hampir semua broker pesan. Ini adalah alternatif untuk AMQP (Advanced Message Queuing Protocol) dan JMS (Java Messaging Service).

STOMP mendefinisikan protokol untuk klien / server untuk berkomunikasi menggunakan semantik pesan. Semantik berada di atas WebSockets dan menentukan bingkai yang dipetakan ke bingkai WebSockets.

Menggunakan STOMP memberi kami fleksibilitas untuk mengembangkan klien dan server dalam bahasa pemrograman yang berbeda. Dalam contoh saat ini, kami akan menggunakan STOMP untuk pengiriman pesan antara klien dan server.

4. Server WebSocket

Anda dapat membaca selengkapnya tentang membangun server WebSocket di artikel ini.

5. Klien WebSocket

Untuk berkomunikasi dengan server WebSocket, klien harus memulai koneksi WebSocket dengan mengirimkan permintaan HTTP ke server dengan header Upgrade yang diatur dengan benar:

GET ws://websocket.example.com/ HTTP/1.1 Origin: //example.com Connection: Upgrade Host: websocket.example.com Upgrade: websocket

Harap dicatat bahwa URL WebSocket menggunakan skema ws dan wss , yang kedua menandakan WebSockets aman.

Server merespon kembali dengan mengirimkan header Upgrade sebagai respon jika dukungan WebSockets diaktifkan.

HTTP/1.1 101 WebSocket Protocol Handshake Date: Wed, 16 Oct 2013 10:07:34 GMT Connection: Upgrade Upgrade: WebSocket

Setelah proses ini (juga dikenal sebagai handshake WebSocket) selesai, koneksi HTTP awal diganti dengan koneksi WebSocket di atas koneksi TCP / IP yang sama, setelah itu salah satu pihak dapat berbagi data.

Koneksi sisi klien ini dimulai oleh instance WebSocketStompClient .

5.1. The WebSocketStompClient

Seperti yang dijelaskan di bagian 3, pertama-tama kita perlu membuat koneksi WebSocket, dan ini dilakukan menggunakan kelas WebSocketClient .

The WebSocketClient dapat dikonfigurasi menggunakan:

  • StandardWebSocketClient disediakan oleh implementasi JSR-356 seperti Tyrus
  • JettyWebSocketClient disediakan oleh Jetty 9+ API WebSocket asli
  • Setiap implementasi WebSocketClient Spring

Kami akan menggunakan StandardWebSocketClient , implementasi WebSocketClient dalam contoh kami:

WebSocketClient client = new StandardWebSocketClient(); WebSocketStompClient stompClient = new WebSocketStompClient(client); stompClient.setMessageConverter(new MappingJackson2MessageConverter()); StompSessionHandler sessionHandler = new MyStompSessionHandler(); stompClient.connect(URL, sessionHandler); new Scanner(System.in).nextLine(); // Don't close immediately. 

Secara default, WebSocketStompClient mendukung SimpleMessageConverter . Karena kita berurusan dengan pesan JSON, kita menetapkan konverter pesan ke MappingJackson2MessageConverter untuk mengubah muatan JSON menjadi objek.

Sementara menghubungkan ke titik akhir, kami melewati sebuah contoh dari StompSessionHandler , yang menangani acara seperti afterConnected dan handleFrame .

Jika server kami memiliki dukungan SockJs, maka kami dapat memodifikasi klien untuk menggunakan SockJsClient daripada StandardWebSocketClient.

5.2. The StompSessionHandler

Kita dapat menggunakan StompSession untuk berlangganan topik WebSocket. Ini dapat dilakukan dengan membuat instance StompSessionHandlerAdapter yang kemudian mengimplementasikan StompSessionHandler .

Sebuah StompSessionHandler menyediakan acara siklus hidup untuk sesi STOMP. Peristiwa termasuk callback saat sesi dibuat dan pemberitahuan jika terjadi kegagalan.

Segera setelah klien WebSocket terhubung ke endpoint, StompSessionHandler akan diberi tahu dan metode afterConnected () dipanggil di mana kita menggunakan StompSession untuk berlangganan ke topik:

@Override public void afterConnected( StompSession session, StompHeaders connectedHeaders) { session.subscribe("/topic/messages", this); session.send("/app/chat", getSampleMessage()); } @Override public void handleFrame(StompHeaders headers, Object payload) { Message msg = (Message) payload; logger.info("Received : " + msg.getText()+ " from : " + msg.getFrom()); }

Pastikan bahwa server WebSocket sedang menjalankan dan menjalankan klien, pesan akan ditampilkan di konsol:

INFO o.b.w.client.MyStompSessionHandler - New session established : 53b993eb-7ad6-4470-dd80-c4cfdab7f2ba INFO o.b.w.client.MyStompSessionHandler - Subscribed to /topic/messages INFO o.b.w.client.MyStompSessionHandler - Message sent to websocket server INFO o.b.w.client.MyStompSessionHandler - Received : Howdy!! from : Nicky 

6. Kesimpulan

Dalam tutorial singkat ini, kami telah mengimplementasikan klien WebSocket berbasis Spring.

Implementasi lengkap dapat ditemukan di GitHub.