WebSocket হলো একটি পূর্ণ-ডুপ্লেক্স (full-duplex) যোগাযোগ প্রোটোকল যা ক্লায়েন্ট এবং সার্ভারের মধ্যে একটি স্থিতিশীল কানেকশন স্থাপন করে। এটি সাধারণ HTTP রিকোয়েস্ট-রেসপন্স মডেল থেকে বেরিয়ে আসতে সাহায্য করে এবং রিয়েল-টাইম, ইন্টারঅ্যাকটিভ অ্যাপ্লিকেশন তৈরি করার জন্য উপযুক্ত। স্প্রিং ফ্রেমওয়ার্ক WebSocket সমর্থন প্রদান করে, যেখানে STOMP (Simple Text Oriented Messaging Protocol) এবং SockJS দুটি গুরুত্বপূর্ণ প্রযুক্তি।
STOMP একটি মেসেজিং প্রোটোকল যা WebSocket এর উপর ভিত্তি করে বার্তা আদান-প্রদান করার জন্য ব্যবহৃত হয় এবং SockJS একটি লাইব্রেরি যা WebSocket এর জন্য fallback মেকানিজম প্রদান করে যখন WebSocket নেটওয়ার্কে ব্যবহৃত হতে পারে না।
Spring WebSocket API STOMP এবং SockJS এর মাধ্যমে সহজে রিয়েল-টাইম মেসেজিং সমর্থন করতে পারে।
STOMP কি এবং কেন এটি ব্যবহৃত হয়?
STOMP (Simple Text Oriented Messaging Protocol) একটি মেসেজিং প্রোটোকল যা টেক্সট-ভিত্তিক বার্তা আদান-প্রদান করার জন্য ব্যবহৃত হয়। এটি বিভিন্ন মেসেজিং সার্ভিস এবং অ্যাপ্লিকেশনগুলির মধ্যে যোগাযোগের জন্য ব্যবহৃত হয়। STOMP মেসেজগুলো text frame আকারে প্রেরিত হয়, এবং এটির মাধ্যমে ক্লায়েন্ট এবং সার্ভার মধ্যে সহজে বার্তা আদান-প্রদান করা সম্ভব।
Spring Framework STOMP প্রোটোকলকে WebSocket এর সাথে সংযুক্ত করে। STOMP-এর মাধ্যমে, ক্লায়েন্ট এবং সার্ভার রিয়েল-টাইম মেসেজ আদান-প্রদান করতে সক্ষম হয়।
SockJS কি এবং কেন এটি ব্যবহৃত হয়?
SockJS একটি JavaScript লাইব্রেরি যা WebSocket প্রোটোকলকে fallback করে এবং তার মাধ্যমে এটি নেটওয়ার্ক পরিস্থিতি অনুযায়ী অন্য যোগাযোগ প্রোটোকলে চলে যেতে পারে, যেমন XHR polling, iframe-based polling, বা long polling। এটি বিশেষত ক্লায়েন্টের ব্রাউজারে WebSocket সাপোর্ট না থাকলে কাজে আসে এবং এটি WebSocket কানেকশন ব্যবহারের জন্য একটি নির্ভরযোগ্য বিকল্প প্রদান করে।
Spring WebSocket, STOMP এবং SockJS ব্যবহার করে Communication Setting
Spring WebSocket, STOMP এবং SockJS ব্যবহার করে রিয়েল-টাইম মেসেজিং চালাতে হলে, নিম্নলিখিত ধাপগুলো অনুসরণ করতে হবে:
১. Spring WebSocket Configurations
প্রথমেই, Spring Boot অ্যাপ্লিকেশনে WebSocket কনফিগারেশন সেটআপ করতে হবে। Spring Boot অ্যাপ্লিকেশনে @EnableWebSocket এবং @Configuration অ্যানোটেশন ব্যবহার করে WebSocket কনফিগার করা হয়।
WebSocketConfig ক্লাস
package com.example.config;
import org.springframework.context.annotation.Configuration;
import org.springframework.messaging.simp.config.MessageBrokerRegistry;
import org.springframework.web.socket.config.annotation.EnableWebSocketMessageBroker;
import org.springframework.web.socket.config.annotation.StompEndpointRegistry;
import org.springframework.web.socket.config.annotation.WebSocketMessageBrokerConfigurer;
@Configuration
@EnableWebSocketMessageBroker
public class WebSocketConfig implements WebSocketMessageBrokerConfigurer {
@Override
public void configureMessageBroker(MessageBrokerRegistry config) {
// Enable a simple memory-based message broker to carry messages back to the client on destination prefixed with "/topic"
config.enableSimpleBroker("/topic");
// Application destination prefix (i.e. /app)
config.setApplicationDestinationPrefixes("/app");
}
@Override
public void registerStompEndpoints(StompEndpointRegistry registry) {
// Register STOMP endpoint and map it to "/gs-guide-websocket"
registry.addEndpoint("/gs-guide-websocket")
.setAllowedOrigins("*") // Allows connections from any domain
.withSockJS(); // Enable SockJS support for fallback options
}
}
এখানে:
@EnableWebSocketMessageBroker: এটি WebSocket message broker সক্রিয় করে, যাতে STOMP পদ্ধতিতে বার্তা প্রেরণ করা সম্ভব হয়।configureMessageBroker: এটি STOMP এবং WebSocket এর মাধ্যমে সঠিক মেসেজিং প্রোটোকল কনফিগার করে।registerStompEndpoints: এটি WebSocket কানেকশন এন্ডপয়েন্ট (যেমন/gs-guide-websocket) নিবন্ধন করে এবং SockJS সমর্থন যোগ করে।
২. Controller Setup for Sending/Receiving Messages
এখন, একটি Controller তৈরি করতে হবে যা STOMP এবং WebSocket এর মাধ্যমে বার্তা পাঠাবে এবং গ্রহণ করবে।
WebSocketController ক্লাস
package com.example.controller;
import org.springframework.messaging.handler.annotation.MessageMapping;
import org.springframework.messaging.simp.SimpMessagingTemplate;
import org.springframework.stereotype.Controller;
@Controller
public class WebSocketController {
private final SimpMessagingTemplate messagingTemplate;
public WebSocketController(SimpMessagingTemplate messagingTemplate) {
this.messagingTemplate = messagingTemplate;
}
@MessageMapping("/send/message")
public void sendMessage(String message) {
// Send the message to all connected users
messagingTemplate.convertAndSend("/topic/messages", message);
}
}
এখানে:
@MessageMapping: এটি STOMP এর মেসেজ মাপিংয়ের জন্য ব্যবহৃত হয়। যখন একটি মেসেজ/send/messageএ আসবে, তখন এটিsendMessage()মেথডে পৌঁছাবে।SimpMessagingTemplate.convertAndSend: এটি মেসেজটি/topic/messagesএ পাঠিয়ে দেয়, যা WebSocket ক্লায়েন্টদের কাছে পৌঁছায়।
৩. Client-Side (HTML + JavaScript)
এখন, STOMP এবং SockJS ব্যবহার করে ক্লায়েন্ট সাইডে মেসেজ পাঠানো এবং গ্রহণ করা হবে। এখানে একটি HTML পৃষ্ঠা এবং JavaScript কোড দেখানো হল।
index.html
<!DOCTYPE html>
<html>
<head>
<title>Spring WebSocket and STOMP Example</title>
<script src="https://cdnjs.cloudflare.com/ajax/libs/sockjs-client/1.5.1/sockjs.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/stomp.js/2.3.3/stomp.min.js"></script>
</head>
<body>
<h1>Spring WebSocket and STOMP</h1>
<div>
<input type="text" id="message" placeholder="Type a message">
<button onclick="sendMessage()">Send</button>
</div>
<div id="messages"></div>
<script>
// Connect to the WebSocket server
var socket = new SockJS('/gs-guide-websocket');
var stompClient = Stomp.over(socket);
// Connect to the STOMP server
stompClient.connect({}, function(frame) {
console.log('Connected: ' + frame);
// Subscribe to the topic to receive messages
stompClient.subscribe('/topic/messages', function(message) {
var messagesDiv = document.getElementById('messages');
messagesDiv.innerHTML += "<p>" + message.body + "</p>";
});
});
// Send a message via STOMP
function sendMessage() {
var message = document.getElementById('message').value;
stompClient.send("/app/send/message", {}, message);
}
</script>
</body>
</html>
এখানে:
- SockJS এবং STOMP লাইব্রেরি ব্যবহার করে ক্লায়েন্ট WebSocket সার্ভারের সাথে সংযোগ স্থাপন করে।
stompClient.connect: এটি STOMP সার্ভারের সাথে সংযোগ তৈরি করে।stompClient.subscribe: এটি/topic/messagesএর সাথে সাবস্ক্রাইব করে, যেখানে সার্ভার মেসেজ পাঠাবে।stompClient.send: এটি মেসেজটি STOMP সার্ভারে পাঠায়, যা পরে/topic/messagesএ পৌঁছায়।
Spring WebSocket Communication এর সুবিধা
- Real-Time Communication: WebSocket ব্যবহার করে ক্লায়েন্ট এবং সার্ভারের মধ্যে রিয়েল-টাইম, পূর্ণ-ডুপ্লেক্স (Full-Duplex) যোগাযোগ সহজে করা সম্ভব।
- Scalability: STOMP এবং SockJS ব্যবহার করে আপনি একাধিক ক্লায়েন্টের সাথে মেসেজিং করতে পারেন, যা বড় আকারের সিস্টেমে কার্যকর।
- Fallback Mechanism: SockJS ব্রাউজার যে কোনো কারণে WebSocket সাপোর্ট না করলে স্বয়ংক্রিয়ভাবে অন্য যোগাযোগ পদ্ধতিতে স্যুইচ করতে সহায়তা করে।
- Low Latency: WebSocket সংযোগটি ক্লায়েন্ট এবং সার্ভারের মধ্যে স্থায়ীভাবে খোলা থাকে, তাই মেসেজ প্রেরণ এবং গ্রহণ করার সময় দেরি হয় না।
সারাংশ
Spring WebSocket, STOMP এবং SockJS ব্যবহার করে রিয়েল-টাইম মেসেজিং সেটআপ করা যায় যেখানে WebSocket ক্লায়েন্ট এবং সার্ভারের মধ্যে সংযোগ স্থাপন করা হয় এবং মেসেজ আদান-প্রদান করা হয়। STOMP প্রোটোকল মেসেজিং সার্ভিসের জন্য ব্যবহার করা হয়, এবং SockJS ব্রাউজারে WebSocket সাপোর্ট না থাকলে fallback পদ্ধতি সরবরাহ করে। Spring Boot এ এটি সহজে কনফিগার এবং ইমপ্লিমেন্ট করা যায়, যা রিয়েল-টাইম অ্যাপ্লিকেশন যেমন চ্যাট সিস্টেম বা লাইভ আপডেট সিস্টেম তৈরির জন্য উপযোগী।
Read more