Spring MVC এবং WebSocket ইন্টিগ্রেটেশন আপনাকে রিয়েল-টাইম, ডুয়াল-ডিরেকশনাল (bi-directional) যোগাযোগের সুবিধা দেয়, যেখানে ক্লায়েন্ট এবং সার্ভার একে অপরকে মেসেজ পাঠাতে পারে। WebSocket ব্যবহার করে আপনি HTTP রিকোয়েস্ট এবং রেসপন্স ছাড়া স্থায়ী সংযোগ স্থাপন করতে পারবেন, যা রিয়েল-টাইম অ্যাপ্লিকেশন যেমন চ্যাট, গেম, নোটিফিকেশন ইত্যাদি তৈরি করতে সহায়ক।
Spring WebSocket ব্যবহারের জন্য Spring MVC তে কিছু কনফিগারেশন এবং কম্পোনেন্ট তৈরি করতে হবে। Spring 4.0 এবং তার পরবর্তী সংস্করণে WebSocket API সমর্থন করা হয়।
এখানে আমি একটি সাধারণ Spring MVC এবং WebSocket ইন্টিগ্রেটেশন এর উদাহরণ দেখাচ্ছি।
প্রথমে, আপনার pom.xml
ফাইলে WebSocket এবং Spring MVC এর জন্য নির্ভরতাগুলি যোগ করুন:
<dependencies>
<!-- Spring WebSocket dependency -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-websocket</artifactId>
<version>5.3.9</version> <!-- Use the latest version -->
</dependency>
<!-- Spring Web Starter (for Spring MVC) -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!-- Spring Boot WebSocket support -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-websocket</artifactId>
</dependency>
</dependencies>
spring-websocket
: WebSocket সার্ভিসের জন্য প্রয়োজনীয় ক্লাস এবং API প্রদান করে।spring-boot-starter-websocket
: Spring Boot WebSocket কনফিগারেশন সরবরাহ করে।Spring MVC-তে WebSocket সক্রিয় করতে @Configuration
ক্লাসে WebSocket কনফিগারেশন যোগ করুন।
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.WebSocketMessageBrokerConfigurer;
@Configuration
@EnableWebSocketMessageBroker
public class WebSocketConfig implements WebSocketMessageBrokerConfigurer {
@Override
public void configureMessageBroker(MessageBrokerRegistry config) {
// Enable the simple broker for message routing
config.enableSimpleBroker("/topic", "/queue"); // Subscription prefixes
config.setApplicationDestinationPrefixes("/app"); // Prefix for send-to destination
}
@Override
public void registerStompEndpoints(org.springframework.web.socket.config.annotation.WebSocketHandlerRegistry registry) {
// Register WebSocket endpoint (client will connect to this URL)
registry.addEndpoint("/chat").withSockJS(); // The WebSocket URL is "/chat"
}
}
@EnableWebSocketMessageBroker
: WebSocket এর জন্য বার্তা ব্রোকার সক্রিয় করে। এটি WebSocket-এ ক্লায়েন্ট এবং সার্ভারের মধ্যে মেসেজ পাঠানোর জন্য ব্যবহৃত হয়।configureMessageBroker()
: এখানে আপনি মেসেজ ব্রোকার কনফিগার করতে পারেন এবং নির্দিষ্ট destination prefixes এবং broker prefixes সেট করতে পারেন।registerStompEndpoints()
: এটি STOMP (Simple Text Oriented Messaging Protocol) প্রোটোকল ব্যবহার করে ক্লায়েন্ট এবং সার্ভারের মধ্যে WebSocket সংযোগের জন্য একটি এন্ডপয়েন্ট নিবন্ধিত করে। এটি SockJS সমর্থন করে, যা ক্লায়েন্টদের ব্রাউজারের সাথে সংযোগ করতে সহায়ক।এখন একটি কন্ট্রোলার তৈরি করুন যা WebSocket মাধ্যমে ক্লায়েন্ট এবং সার্ভারের মধ্যে বার্তা আদান-প্রদান করবে।
package com.example.controller;
import org.springframework.messaging.handler.annotation.MessageMapping;
import org.springframework.messaging.handler.annotation.SendTo;
import org.springframework.stereotype.Controller;
@Controller
public class WebSocketController {
// This method handles incoming messages and sends a response back to the client
@MessageMapping("/sendMessage") // This maps the client message to this method
@SendTo("/topic/messages") // Send the response to the /topic/messages topic
public String sendMessage(String message) {
return "Server received: " + message; // Message to be sent to the clients
}
}
@MessageMapping
: এটি ক্লায়েন্ট থেকে আসা মেসেজকে মেথডে ম্যাপ করে। এখানে /sendMessage
হল মেসেজ পাঠানোর জন্য নির্দিষ্ট URL বা প্রোপার্টি।@SendTo
: এটি একটি নির্দিষ্ট টপিকে (যেমন /topic/messages
) মেসেজ পাঠায়, যেখানে ক্লায়েন্টরা সাবস্ক্রাইব করবে।এখন HTML ফাইল তৈরি করুন যেখানে WebSocket যোগাযোগ তৈরি হবে এবং ক্লায়েন্ট থেকে সার্ভারে মেসেজ পাঠানো হবে।
<!DOCTYPE html>
<html>
<head>
<title>Spring WebSocket Chat</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>
<h2>WebSocket Chat</h2>
<div>
<input type="text" id="messageInput" placeholder="Enter your message" />
<button onclick="sendMessage()">Send Message</button>
</div>
<h3>Messages:</h3>
<ul id="messageList"></ul>
<script>
var stompClient = null;
// Connect to WebSocket and start receiving messages
function connect() {
var socket = new SockJS('/chat'); // Connect to the WebSocket endpoint
stompClient = Stomp.over(socket);
stompClient.connect({}, function(frame) {
console.log('Connected: ' + frame);
stompClient.subscribe('/topic/messages', function(message) {
showMessage(message.body); // Display the received message
});
});
}
// Send message to the server
function sendMessage() {
var message = document.getElementById('messageInput').value;
stompClient.send("/app/sendMessage", {}, message); // Send message to the server via WebSocket
document.getElementById('messageInput').value = ''; // Clear the input field
}
// Show the received message in the list
function showMessage(message) {
var messageList = document.getElementById('messageList');
var listItem = document.createElement('li');
listItem.textContent = message;
messageList.appendChild(listItem);
}
// Establish WebSocket connection when page loads
connect();
</script>
</body>
</html>
/chat
: এটি WebSocket এন্ডপয়েন্ট যেখানে ক্লায়েন্ট সংযোগ করবে।/app/sendMessage
: এটি সেই URL যেটি ক্লায়েন্ট থেকে মেসেজ পাঠাবে। @MessageMapping("/sendMessage")
এই URL এর সাথে ম্যাপ করা হয়েছে।Spring MVC এবং WebSocket ইন্টিগ্রেশন রিয়েল-টাইম অ্যাপ্লিকেশন তৈরি করতে সহায়ক। WebSocket এবং STOMP এর মাধ্যমে Spring MVC অ্যাপ্লিকেশনে bi-directional communication সহজে বাস্তবায়ন করা যায়। এটি চ্যাট অ্যাপ্লিকেশন, লাইভ নোটিফিকেশন সিস্টেম বা অন্যান্য রিয়েল-টাইম সিস্টেম তৈরি করার জন্য আদর্শ। Spring WebSocket কনফিগারেশনটি অত্যন্ত সহজ এবং Spring Boot এর সাথে এটি আরও দ্রুত এবং কার্যকরী।
WebSocket হল একটি প্রোটোকল যা ক্লায়েন্ট এবং সার্ভারের মধ্যে রিয়েল-টাইম, ডুয়াল-ডিরেকশনাল (Full-Duplex) কমিউনিকেশন স্থাপন করতে ব্যবহৃত হয়। WebSocket ক্লায়েন্ট এবং সার্ভারের মধ্যে একটি স্থায়ী কানেকশন তৈরি করে, যা সময়মতো ডাটা আদান-প্রদান করতে সক্ষম হয়। এটি সাধারনত হাই লেটেন্স কমিউনিকেশন এবং রিয়েল-টাইম ডাটা ট্রান্সফার অ্যাপ্লিকেশনগুলোতে ব্যবহৃত হয়, যেমন চ্যাট অ্যাপ্লিকেশন, স্টক মার্কেট অ্যাপ্লিকেশন, এবং গেমিং অ্যাপ্লিকেশন।
WebSocket এর প্রধান সুবিধা হলো এটি HTTP রিকোয়েস্টের মতো নতুন কানেকশন খুলে না, বরং একটি একক কানেকশন তৈরি করে যার মাধ্যমে বারবার ডাটা আদান-প্রদান সম্ভব।
WebSocket এর কাজের প্রক্রিয়াটি নিম্নরূপ:
Spring Framework WebSocket সমর্থন করে এবং Spring WebSocket এর মাধ্যমে আপনাকে সহজে রিয়েল-টাইম কমিউনিকেশন সেটআপ করতে সহায়তা করে। এখানে একটি Spring Boot WebSocket উদাহরণ দেখানো হলো।
Spring Boot অ্যাপ্লিকেশন জন্য WebSocket ডিপেনডেন্সি যোগ করুন।
<dependencies>
<!-- Spring Boot Starter Web for basic WebSocket functionality -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-websocket</artifactId>
</dependency>
<!-- Spring Boot Starter Web for MVC functionality -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!-- Spring Boot Starter Thymeleaf for rendering views -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-thymeleaf</artifactId>
</dependency>
</dependencies>
spring-boot-starter-websocket
: WebSocket কার্যকারিতা যোগ করার জন্য।spring-boot-starter-web
: ওয়েব অ্যাপ্লিকেশন তৈরির জন্য মৌলিক স্টার্টার।Spring WebSocket কনফিগার করতে একটি কনফিগারেশন ক্লাস তৈরি করুন।
import org.springframework.context.annotation.Configuration;
import org.springframework.web.socket.WebSocketHandler;
import org.springframework.web.socket.config.annotation.EnableWebSocket;
import org.springframework.web.socket.config.annotation.WebSocketConfigurer;
import org.springframework.web.socket.config.annotation.WebSocketHandlerRegistry;
@Configuration
@EnableWebSocket
public class WebSocketConfig implements WebSocketConfigurer {
@Override
public void registerWebSocketHandlers(WebSocketHandlerRegistry registry) {
registry.addHandler(myWebSocketHandler(), "/chat")
.setAllowedOrigins("*"); // Allow all origins for this handler
}
public WebSocketHandler myWebSocketHandler() {
return new MyWebSocketHandler();
}
}
@EnableWebSocket
: Spring MVC WebSocket কার্যকারিতা সক্ষম করতে ব্যবহৃত হয়।WebSocketHandlerRegistry
: WebSocket হ্যান্ডলার রেজিস্টার করতে ব্যবহৃত হয়।myWebSocketHandler()
: কাস্টম WebSocket হ্যান্ডলার ক্লাস তৈরি করা।WebSocket হ্যান্ডলার হ'ল সেই অংশ যা WebSocket কানেকশন পরিচালনা করে এবং বার্তা প্রেরণ এবং গ্রহণ করে।
import org.springframework.web.socket.WebSocketSession;
import org.springframework.web.socket.TextMessage;
import org.springframework.web.socket.WebSocketHandler;
import org.springframework.web.socket.CloseStatus;
import java.io.IOException;
public class MyWebSocketHandler implements WebSocketHandler {
@Override
public void afterConnectionEstablished(WebSocketSession session) throws Exception {
// Connection established with client
System.out.println("Connected to client: " + session.getId());
}
@Override
public void handleMessage(WebSocketSession session, org.springframework.web.socket.WebSocketMessage<?> message) throws Exception {
// Handle incoming messages
System.out.println("Received message: " + message.getPayload());
// Send a message back to the client
session.sendMessage(new TextMessage("Hello Client, you said: " + message.getPayload()));
}
@Override
public void handleTransportError(WebSocketSession session, Throwable exception) throws Exception {
System.out.println("Error occurred: " + exception.getMessage());
}
@Override
public void afterConnectionClosed(WebSocketSession session, CloseStatus closeStatus) throws Exception {
// Cleanup after connection closed
System.out.println("Connection closed: " + session.getId());
}
@Override
public boolean supportsPartialMessages() {
return false;
}
}
afterConnectionEstablished
: ক্লায়েন্টের সাথে কানেকশন স্থাপন হলে এটি কল করা হয়।handleMessage
: ক্লায়েন্ট থেকে মেসেজ গ্রহণ এবং তা প্রসেস করা।handleTransportError
: ট্রান্সপোর্টের ত্রুটি হ্যান্ডলিং।afterConnectionClosed
: ক্লায়েন্টের সাথে কানেকশন বন্ধ হলে এটি কল করা হয়।আপনি WebSocket কানেকশন ক্লায়েন্ট সাইডে JavaScript দিয়ে তৈরি করতে পারেন। এখানে একটি উদাহরণ দেওয়া হলো যেখানে একটি HTML পেজ ব্যবহারকারীর মেসেজ সার্ভারে পাঠায় এবং সার্ভার থেকে উত্তর গ্রহণ করে।
<!DOCTYPE html>
<html>
<head>
<title>WebSocket Chat</title>
</head>
<body>
<h2>WebSocket Chat</h2>
<input type="text" id="message" />
<button onclick="sendMessage()">Send Message</button>
<p id="response"></p>
<script>
var socket = new WebSocket("ws://localhost:8080/chat");
socket.onopen = function(event) {
console.log("Connected to WebSocket server");
};
socket.onmessage = function(event) {
document.getElementById("response").innerText = event.data;
};
function sendMessage() {
var message = document.getElementById("message").value;
socket.send(message);
}
</script>
</body>
</html>
new WebSocket("ws://localhost:8080/chat")
: ওয়েবসকেট কানেকশন স্থাপন করা।socket.onmessage
: সার্ভার থেকে আসা মেসেজ শো করা।mvn spring-boot:run
অথবা আপনার IDE থেকে WebSocketConfig
এবং MyWebSocketHandler
ক্লাস চালিয়ে অ্যাপ্লিকেশনটি রান করুন।http://localhost:8080/chat
।Spring MVC তে WebSocket ব্যবহারের মাধ্যমে আপনি রিয়েল-টাইম ডাটা ট্রান্সফার করতে পারেন। এটি ক্লায়েন্ট এবং সার্ভারের মধ্যে স্থায়ী কানেকশন তৈরি করে এবং তা দিয়ে ডুয়াল-ডিরেকশনাল যোগাযোগ সম্ভব করে। Spring WebSocket কনফিগারেশন, হ্যান্ডলার এবং ক্লায়েন্ট সাইডের জন্য JavaScript কোডের মাধ্যমে আপনি সহজে রিয়েল-টাইম চ্যাট অ্যাপ্লিকেশন তৈরি করতে পারবেন।
WebSocket হল একটি কমিউনিকেশন প্রোটোকল যা ক্লায়েন্ট এবং সার্ভারের মধ্যে একটি স্থিতিশীল, দ্বিমুখী সংযোগ তৈরি করতে ব্যবহৃত হয়। এটি বিশেষ করে রিয়েল-টাইম অ্যাপ্লিকেশন যেমন চ্যাট অ্যাপ্লিকেশন, নোটিফিকেশন সিস্টেম, গেমস, ফিনান্সিয়াল ট্র্যাকিং ইত্যাদিতে ব্যবহার করা হয়।
Spring MVC তে WebSocket ব্যবহার করতে Spring WebSocket এবং STOMP প্রোটোকল ব্যবহার করা হয়, যা মেসেজিং লেভেলে সহায়ক হয়। WebSocket সংযোগ ব্যবস্থাপনার জন্য Spring Messaging এবং Spring WebSocket লাইব্রেরি ব্যবহৃত হয়। Spring Boot প্রকল্পে WebSocket কনফিগারেশন আরও সহজ হয়ে যায়, তবে সাধারণ Spring MVC প্রকল্পেও কনফিগারেশন করা যায়।
Spring WebSocket এবং Spring Messaging এর জন্য নিম্নলিখিত ডিপেনডেন্সিগুলি pom.xml ফাইলে যোগ করতে হবে।
Maven Dependency:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-websocket</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.messaging</groupId>
<artifactId>spring-messaging</artifactId>
</dependency>
Spring WebSocket কনফিগার করার জন্য @EnableWebSocket
অ্যানোটেশন ব্যবহার করতে হয় এবং WebSocketConfigurer
ইন্টারফেস ইমপ্লিমেন্ট করতে হয়।
WebSocketConfig.java:
import org.springframework.context.annotation.Configuration;
import org.springframework.web.socket.config.annotation.EnableWebSocket;
import org.springframework.web.socket.config.annotation.WebSocketConfigurer;
import org.springframework.web.socket.config.annotation.WebSocketHandlerRegistry;
import org.springframework.web.socket.server.support.HttpSessionHandshakeInterceptor;
@Configuration
@EnableWebSocket
public class WebSocketConfig implements WebSocketConfigurer {
@Override
public void registerWebSocketHandlers(WebSocketHandlerRegistry registry) {
registry.addHandler(new MyWebSocketHandler(), "/ws")
.addInterceptors(new HttpSessionHandshakeInterceptor()) // Optional, for session handling
.setAllowedOrigins("*"); // Allow all origins, or restrict to specific ones
}
}
Explanation:
@EnableWebSocket
: Spring WebSocket সক্রিয় করার জন্য এই অ্যানোটেশন ব্যবহার করা হয়।WebSocketConfigurer
: WebSocket হ্যান্ডলার রেজিস্টার করার জন্য WebSocketConfigurer
ইন্টারফেস ইমপ্লিমেন্ট করতে হয়।/ws
: এই URL পাথের মাধ্যমে WebSocket কানেকশন সম্পন্ন হবে।setAllowedOrigins("*")
: এই কনফিগারেশনটি সমস্ত উৎস থেকে কানেকশন অনুমতি দেয়। আপনি নির্দিষ্ট URL এর জন্য কানেকশন সীমিত করতে পারেন।WebSocketHandler কনফিগার করা হয় যে কোন WebSocket ক্লায়েন্টের সাথে সার্ভারের যোগাযোগ কীভাবে হবে।
MyWebSocketHandler.java:
import org.springframework.web.socket.TextMessage;
import org.springframework.web.socket.WebSocketHandler;
import org.springframework.web.socket.WebSocketSession;
import org.springframework.web.socket.handler.TextWebSocketHandler;
public class MyWebSocketHandler extends TextWebSocketHandler {
@Override
public void handleTextMessage(WebSocketSession session, TextMessage message) throws Exception {
// Handle incoming message and send a response
String responseMessage = "Hello from server: " + message.getPayload();
session.sendMessage(new TextMessage(responseMessage)); // Send response back to client
}
}
Explanation:
TextWebSocketHandler
: TextWebSocketHandler
ইমপ্লিমেন্ট করে আপনি WebSocket সংযোগের মাধ্যমে প্রাপ্ত টেক্সট মেসেজগুলির প্রক্রিয়া করতে পারেন।handleTextMessage
: এই মেথডে আপনি ক্লায়েন্ট থেকে প্রাপ্ত টেক্সট মেসেজ এবং সার্ভারের রেসপন্স মেসেজ পরিচালনা করবেন।session.sendMessage()
: এখানে সার্ভার ক্লায়েন্টে একটি রেসপন্স পাঠাচ্ছে।Client-Side WebSocket ব্যবহার করতে JavaScript এ WebSocket API ব্যবহার করা হয়। নিচে একটি উদাহরণ দেওয়া হয়েছে যেখানে WebSocket ক্লায়েন্ট সার্ভারের সাথে কানেক্ট হয়ে মেসেজ পাঠাবে এবং সার্ভার থেকে মেসেজ গ্রহণ করবে।
client.html:
<!DOCTYPE html>
<html>
<head>
<title>WebSocket Test</title>
</head>
<body>
<h2>WebSocket Test</h2>
<button onclick="sendMessage()">Send Message</button>
<div id="response"></div>
<script>
var socket = new WebSocket("ws://localhost:8080/ws"); // WebSocket URL
socket.onopen = function() {
console.log("Connected to WebSocket server.");
};
socket.onmessage = function(event) {
document.getElementById("response").innerText = "Server says: " + event.data;
};
socket.onclose = function() {
console.log("Disconnected from WebSocket server.");
};
function sendMessage() {
socket.send("Hello from client!"); // Send message to server
}
</script>
</body>
</html>
Explanation:
new WebSocket("ws://localhost:8080/ws")
: এখানে WebSocket URL তৈরি করা হয়েছে, যেখানে ws://localhost:8080/ws
এর মাধ্যমে WebSocket সার্ভারের সাথে কানেকশন করা হবে।onopen
: WebSocket কানেকশন সফল হলে এই ইভেন্ট ফায়ার হবে।onmessage
: সার্ভার থেকে মেসেজ আসলে এই ইভেন্ট ফায়ার হবে এবং মেসেজটি <div>
এর মধ্যে দেখানো হবে।sendMessage()
: ক্লায়েন্ট থেকে সার্ভারে মেসেজ পাঠানোর জন্য এটি ব্যবহৃত হয়।Spring Boot অ্যাপ্লিকেশনের মূল ক্লাস তৈরি করুন যাতে Spring Boot অ্যাপ্লিকেশন চালু করা যায়।
WebSocketApplication.java:
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication
public class WebSocketApplication {
public static void main(String[] args) {
SpringApplication.run(WebSocketApplication.class, args);
}
}
client.html
ফাইলটি একটি ব্রাউজারে খুলুন।Spring MVC তে WebSocket Integration করার মাধ্যমে আপনি ক্লায়েন্ট এবং সার্ভারের মধ্যে রিয়েল-টাইম দ্বিমুখী যোগাযোগ ব্যবস্থা তৈরি করতে পারেন। এই পদ্ধতিটি চ্যাট অ্যাপ্লিকেশন, নোটিফিকেশন, গেমিং বা অন্যান্য রিয়েল-টাইম অ্যাপ্লিকেশনে ব্যবহৃত হয়। Spring WebSocket এবং STOMP প্রোটোকল ব্যবহার করে আপনি WebSocket সংযোগ পরিচালনা করতে পারেন। Spring MVC এবং WebSocket এর মধ্যে ইন্টিগ্রেশন বেশ সোজা, এবং আপনি খুব সহজেই Spring Boot অ্যাপ্লিকেশনে এই প্রযুক্তি ব্যবহার করতে পারবেন।
STOMP (Streaming Text Oriented Messaging Protocol) এবং SockJS হল দুটি প্রযুক্তি যা Spring MVC তে Real-time Communication বা WebSocket-based communication বাস্তবায়নের জন্য ব্যবহৃত হয়। এই প্রযুক্তিগুলি সাধারণত WebSocket এর সাথে ব্যবহৃত হয় যা ক্লায়েন্ট এবং সার্ভারের মধ্যে ডেটা আদান-প্রদান করার জন্য একটি পূর্ণ-দ্বিদিশী সংযোগ স্থাপন করে।
STOMP হল একটি সহজ এবং টেক্সট ভিত্তিক প্রোটোকল যা ক্লায়েন্ট এবং সার্ভারের মধ্যে মেসেজ আদান-প্রদান করতে ব্যবহৃত হয়। এটি WebSocket প্রোটোকলের উপর তৈরি করা হয় এবং সাধারণত message-oriented middleware এর জন্য ব্যবহৃত হয়। STOMP প্রটোকলটি মেসেজকে নির্দিষ্ট topics বা queues এর মাধ্যমে পাঠায় এবং গ্রাহকরা সেই মেসেজ গ্রহণ করতে পারে। এটি pub/sub (publish/subscribe) মডেল সমর্থন করে।
STOMP প্রোটোকল ক্লায়েন্ট এবং সার্ভারের মধ্যে ইভেন্ট-ভিত্তিক যোগাযোগ সহজতর করতে সাহায্য করে। Spring এর মাধ্যমে STOMP ব্যবহার করে আপনি মেসেজ কনজিউমার এবং প্রডিউসার তৈরি করতে পারেন এবং অ্যাপ্লিকেশনের মধ্যে ইভেন্ট চালাতে পারেন।
SockJS একটি ব্রাউজার লাইব্রেরি যা WebSocket সমর্থন না থাকা ব্রাউজারগুলির জন্য ফ্যালব্যাক সমাধান প্রদান করে। SockJS WebSocket-এর উপর ভিত্তি করে কাজ করে এবং যদি ব্রাউজার WebSocket সমর্থন না করে, তবে এটি অন্যান্য প্রোটোকল ব্যবহার করে (যেমন, XHR polling, long-polling, iframe-based transports)। এটি WebSocket-like আচরণ প্রদান করে এবং real-time communication-এ সক্ষম করে।
SockJS এবং STOMP মিলে এমন একটি সমাধান তৈরি করে যা বাস্তবসম্মত এবং সমর্থনযোগ্য হয় এবং বিভিন্ন ব্রাউজারে কাজ করে।
Spring MVC তে STOMP এবং SockJS ব্যবহার করে WebSocket ভিত্তিক রিয়েল-টাইম কমিউনিকেশন সেটআপ করতে, নিচে কিছু পদক্ষেপ অনুসরণ করতে হবে:
প্রথমে, spring-boot-starter-websocket
এবং spring-boot-starter-messaging
dependencies আপনার pom.xml
ফাইলে যুক্ত করতে হবে।
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-websocket</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-messaging</artifactId>
</dependency>
এখন WebSocket এবং STOMP কনফিগার করতে হবে যাতে Spring WebSocket স্টার্ট করতে পারে।
@Configuration
@EnableWebSocketMessageBroker
public class WebSocketConfig implements WebSocketMessageBrokerConfigurer {
@Override
public void registerStompEndpoints(StompEndpointRegistry registry) {
registry.addEndpoint("/ws").withSockJS(); // SockJS এর মাধ্যমে /ws এন্ডপয়েন্ট খুলে দেব
}
@Override
public void configureMessageBroker(MessageBrokerRegistry registry) {
registry.enableSimpleBroker("/topic"); // /topic এর মাধ্যমে মেসেজ ব্রোকার সক্রিয় করা হচ্ছে
registry.setApplicationDestinationPrefixes("/app"); // /app দিয়ে মেসেজ রুট করা হচ্ছে
}
}
/ws
তৈরি করে, যা ক্লায়েন্টের কাছে উপলব্ধ হবে। withSockJS() ব্যবহার করে SockJS সক্রিয় করা হয়েছে।/topic
একটি পাবলিশড টপিক এবং /app
একটি রুট।স্টাম্প মেসেজ প্রেরণ ও গ্রহণ করার জন্য একটি কন্ট্রোলার তৈরি করা হবে।
@Controller
public class ChatController {
@MessageMapping("/chat") // "/app/chat" থেকে পাঠানো মেসেজ হ্যান্ডল করবে
@SendTo("/topic/messages") // "/topic/messages" এ মেসেজ প্রেরণ করবে
public String sendMessage(String message) {
return message; // মেসেজ ফিরিয়ে দিব
}
}
/app/chat
এর মাধ্যমে মেসেজ গ্রহণ করা হবে।/topic/messages
টপিকে মেসেজ পাঠাবে।এখন ক্লায়েন্ট সাইডে SockJS এবং STOMP ব্যবহার করা হবে। এখানে একটি সাধারণ HTML এবং JavaScript কোড রয়েছে যা WebSocket এর মাধ্যমে মেসেজ পাঠাবে এবং গ্রহণ করবে।
<!DOCTYPE html>
<html>
<head>
<title>Spring WebSocket Chat</title>
<script src="https://cdn.jsdelivr.net/npm/sockjs-client@1.5.0/dist/sockjs.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/stomp.js/2.3.3/stomp.min.js"></script>
</head>
<body>
<h2>WebSocket Chat</h2>
<div id="messages"></div>
<input type="text" id="messageInput" placeholder="Enter message"/>
<button onclick="sendMessage()">Send</button>
<script>
var socket = new SockJS('/ws'); // SockJS স্টার্ট
var stompClient = Stomp.over(socket);
stompClient.connect({}, function (frame) {
console.log('Connected: ' + frame);
stompClient.subscribe('/topic/messages', function (messageOutput) {
var message = messageOutput.body;
document.getElementById("messages").innerHTML += "<p>" + message + "</p>";
});
});
function sendMessage() {
var message = document.getElementById("messageInput").value;
stompClient.send("/app/chat", {}, message); // মেসেজ প্রেরণ
}
</script>
</body>
</html>
/ws
এ স্টার্ট করা হয়েছে, এবং STOMP ক্লায়েন্টের মাধ্যমে মেসেজ পাঠানো হচ্ছে।/app/chat
এর মাধ্যমে মেসেজ পাঠাবে।এখন, Spring Boot অ্যাপ্লিকেশনটি চালু করুন এবং ক্লায়েন্ট পেজে প্রবেশ করুন। আপনি "Send" বাটনে ক্লিক করলে, মেসেজটি সার্ভারে প্রক্রিয়া হবে এবং অন্যান্য ক্লায়েন্টদের কাছে /topic/messages
এর মাধ্যমে পাঠানো হবে।
STOMP এবং SockJS ব্যবহার করে Spring MVC তে Real-time Communication প্রতিষ্ঠিত করা সম্ভব। STOMP WebSocket প্রটোকলের উপর ভিত্তি করে মেসেজ পাঠানো ও গ্রহণের জন্য ব্যবহৃত হয় এবং SockJS WebSocket না থাকা ব্রাউজারে ফ্যালব্যাক প্রযুক্তি হিসেবে কাজ করে। Spring Framework এর সাথে এই প্রযুক্তিগুলি একত্রিত করে আপনি একটি রিয়েল-টাইম, স্কেলেবল এবং ফ্লেক্সিবল অ্যাপ্লিকেশন তৈরি করতে পারবেন।
WebSocket হল একটি প্রোটোকল যা ক্লায়েন্ট এবং সার্ভারের মধ্যে দুটি-পথের যোগাযোগ (two-way communication) তৈরি করে, যা HTTP প্রোটোকলের মাধ্যমে সাধারণত সম্ভব নয়। এটি ডেটা দ্রুত এবং অ্যাসিঙ্ক্রোনাসভাবে পাঠাতে ব্যবহৃত হয়। Spring MVC তে WebSocket ইন্টিগ্রেশন ক্লায়েন্ট এবং সার্ভারের মধ্যে রিয়েল-টাইম ডেটা আদান-প্রদান করতে ব্যবহৃত হয়। Spring WebSocket ইন্টিগ্রেশন Spring 4.0 থেকে পাওয়া যায় এবং এটি Spring Framework-এ অন্তর্ভুক্ত।
Spring MVC তে WebSocket ব্যবহারের জন্য Spring WebSocket এবং STOMP (Simple Text Oriented Messaging Protocol) ব্যবহার করা হয়। STOMP ক্লায়েন্ট এবং সার্ভারের মধ্যে মেসেজ আদান-প্রদান করতে ব্যবহৃত হয়।
Spring WebSocket এবং STOMP ব্যবহারের জন্য আপনাকে spring-boot-starter-websocket ডিপেন্ডেন্সি ব্যবহার করতে হবে।
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-websocket</artifactId>
</dependency>
Spring MVC তে WebSocket কনফিগার করতে WebSocketConfigurer ইন্টারফেস এবং StompEndpointRegistry ব্যবহার করা হয়।
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 registerStompEndpoints(StompEndpointRegistry registry) {
// Register the "/chat" endpoint for clients to connect to
registry.addEndpoint("/chat").withSockJS();
}
@Override
public void configureMessageBroker(MessageBrokerRegistry config) {
// Enable a simple in-memory message broker
config.enableSimpleBroker("/topic"); // "/topic" is the destination for subscribers
config.setApplicationDestinationPrefixes("/app"); // "/app" is the prefix for messages sent from the client
}
}
কন্ট্রোলারে @MessageMapping এবং @SendTo অ্যানোটেশন ব্যবহার করা হয়। @MessageMapping ক্লায়েন্ট থেকে আসা মেসেজ ম্যানেজ করে এবং @SendTo ক্লায়েন্টে রেসপন্স পাঠানোর জন্য ব্যবহৃত হয়।
import org.springframework.messaging.handler.annotation.MessageMapping;
import org.springframework.messaging.simp.SimpMessagingTemplate;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
@Controller
public class ChatController {
private final SimpMessagingTemplate messagingTemplate;
public ChatController(SimpMessagingTemplate messagingTemplate) {
this.messagingTemplate = messagingTemplate;
}
// Handle incoming messages from client
@MessageMapping("/send")
public void sendMessage(ChatMessage message) {
// Broadcast the message to all subscribers of "/topic/messages"
messagingTemplate.convertAndSend("/topic/messages", message);
}
}
public class ChatMessage {
private String sender;
private String content;
// Getters and Setters
}
ক্লায়েন্ট সাইডে SockJS এবং STOMP.js লাইব্রেরি ব্যবহার করা হয়। এই লাইব্রেরিগুলি WebSocket যোগাযোগ সহজতর করে এবং ক্লায়েন্টকে মেসেজ পাঠাতে এবং গ্রহণ করতে সহায়ক হয়।
<!DOCTYPE html>
<html>
<head>
<title>WebSocket Chat</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>
<script>
var stompClient = null;
function connect() {
var socket = new SockJS('/chat'); // Connect to the WebSocket endpoint
stompClient = Stomp.over(socket);
stompClient.connect({}, function (frame) {
console.log('Connected: ' + frame);
stompClient.subscribe('/topic/messages', function (messageOutput) {
showMessage(JSON.parse(messageOutput.body).content);
});
});
}
function sendMessage() {
var message = document.getElementById('message').value;
stompClient.send("/app/send", {}, JSON.stringify({'sender': 'User', 'content': message}));
}
function showMessage(message) {
var messageArea = document.getElementById("messages");
messageArea.value = messageArea.value + "\n" + message;
}
window.onload = connect;
</script>
</head>
<body>
<h2>WebSocket Chat</h2>
<textarea id="messages" rows="10" cols="50" readonly></textarea><br/>
<input type="text" id="message" placeholder="Enter message" />
<button onclick="sendMessage()">Send</button>
</body>
</html>
/app/send
এ পাঠানো হয়।Spring MVC তে WebSocket ইন্টিগ্রেশন দ্বারা আপনি ক্লায়েন্ট এবং সার্ভারের মধ্যে রিয়েল-টাইম ডেটা আদান-প্রদান করতে পারেন। STOMP এবং SockJS ক্লায়েন্ট সাইডে সহজভাবে WebSocket ব্যবহারের সুবিধা দেয়। এই ইন্টিগ্রেশন রিয়েল-টাইম চ্যাট, নোটিফিকেশন, লাইভ আপডেট ইত্যাদি অ্যাপ্লিকেশন তৈরিতে ব্যবহার করা যেতে পারে। Spring WebSocket-এর মাধ্যমে ডায়নামিক এবং ইন্টারঅ্যাকটিভ ওয়েব অ্যাপ্লিকেশন তৈরি করা সহজ।
Read more