Pelanggan Java untuk API WebSockets

1. Pengenalan

HTTP (Hypertext Transfer Protocol) adalah protokol permintaan-permintaan tanpa statistik. Reka bentuknya yang sederhana menjadikannya sangat berskala tetapi tidak sesuai dan tidak cekap untuk aplikasi web masa nyata yang sangat interaktif kerana jumlah overhead yang perlu dihantar bersama dengan setiap permintaan / respons.

Oleh kerana HTTP segerak dan aplikasi masa nyata perlu tidak segerak, sebarang penyelesaian seperti pengundian atau pengundian panjang (Komet) cenderung rumit dan tidak efisien.

Untuk menyelesaikan masalah yang dinyatakan di atas, kami memerlukan protokol berasaskan standard, dua arah dan full-duplex yang dapat digunakan oleh kedua-dua pelayan dan klien, dan ini menyebabkan pengenalan JSR 356 API - dalam artikel ini, kami ' Akan menunjukkan contoh penggunaannya.

2. Persediaan

Mari sertakan pergantungan Spring WebSocket untuk projek kami:

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

Kami sentiasa dapat memperoleh versi terbaru dari pergantungan dari Maven Central untuk spring-websocket dan spring-messaging.

3. STOMP

Protokol Pemesejan Berorientasikan Teks Aliran (STOMP) adalah format wayar mudah yang boleh dikendalikan yang membolehkan pelanggan dan pelayan berkomunikasi dengan hampir semua broker mesej. Ini adalah alternatif untuk AMQP (Advanced Message Queuing Protocol) dan JMS (Java Messaging Service).

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

Menggunakan STOMP memberi kita fleksibiliti untuk mengembangkan klien dan pelayan dalam bahasa pengaturcaraan yang berbeza. Dalam contoh semasa ini, kami akan menggunakan STOMP untuk pemesejan antara pelanggan dan pelayan.

4. Pelayan WebSocket

Anda boleh membaca lebih lanjut mengenai membina pelayan WebSocket dalam artikel ini.

5. Pelanggan WebSocket

Untuk berkomunikasi dengan pelayan WebSocket, klien harus memulai koneksi WebSocket dengan mengirimkan permintaan HTTP ke pelayan dengan set header Peningkatan dengan betul:

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

Harap maklum bahawa URL WebSocket menggunakan skema ws dan wss , yang kedua menandakan WebSockets selamat.

Pelayan bertindak balas dengan menghantar tajuk Naik taraf sebagai respons sekiranya sokongan 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 jabat tangan WebSocket) selesai, sambungan HTTP awal digantikan oleh sambungan WebSocket di atas sambungan TCP / IP yang sama selepas itu mana-mana pihak dapat berkongsi data.

Sambungan sisi pelanggan ini dimulakan oleh instance WebSocketStompClient .

5.1. Pelanggan WebSocketStomp

Seperti yang dijelaskan dalam bahagian 3, pertama-tama kita perlu membuat sambungan WebSocket, dan ini dilakukan menggunakan kelas WebSocketClient .

The WebSocketClient boleh dikonfigurasikan menggunakan:

  • StandardWebSocketClient yang disediakan oleh sebarang pelaksanaan JSR-356 seperti Tyrus
  • JettyWebSocketClient yang disediakan oleh Jetty 9+ WebSocket API asli
  • Sebarang pelaksanaan Spring WebSocketClient

Kami akan menggunakan StandardWebSocketClient , pelaksanaan 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 lalai, WebSocketStompClient menyokong SimpleMessageConverter . Oleh kerana kita berurusan dengan mesej JSON, kita menetapkan penukar mesej ke MappingJackson2MessageConverter untuk menukar muatan JSON menjadi objek.

Semasa menyambung ke titik akhir, kami menyampaikan contoh StompSessionHandler , yang menangani peristiwa seperti afterConnected dan handleFrame .

Sekiranya pelayan kami mempunyai sokongan SockJs, maka kami dapat mengubah suai klien untuk menggunakan SockJsClient dan bukannya StandardWebSocketClient.

5.2. The StompSessionHandler

Kita boleh menggunakan StompSession untuk melanggan topik WebSocket. Ini dapat dilakukan dengan membuat contoh StompSessionHandlerAdapter yang seterusnya menerapkan StompSessionHandler .

A StompSessionHandler menyediakan kitaran hidup untuk sesi STOMP. Acara tersebut merangkumi panggilan balik ketika sesi dibuat dan pemberitahuan sekiranya berlaku kegagalan.

Sebaik sahaja pelanggan WebSocket menyambung ke titik akhir, StompSessionHandler diberitahu dan kaedah afterConnected () dipanggil di mana kita menggunakan StompSession untuk melanggan 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 bahawa pelayan WebSocket menjalankan dan menjalankan klien, mesej akan dipaparkan 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. Kesimpulannya

Dalam tutorial ringkas ini, kami telah menerapkan klien WebSocket berasaskan Spring.

Pelaksanaan lengkap dapat dilihat di GitHub.