WebSocket হল একটি প্রোটোকল যা ক্লায়েন্ট এবং সার্ভারের মধ্যে রিয়েল-টাইম, ডুয়াল-ডিরেকশনাল (Full-Duplex) কমিউনিকেশন স্থাপন করতে ব্যবহৃত হয়। WebSocket ক্লায়েন্ট এবং সার্ভারের মধ্যে একটি স্থায়ী কানেকশন তৈরি করে, যা সময়মতো ডাটা আদান-প্রদান করতে সক্ষম হয়। এটি সাধারনত হাই লেটেন্স কমিউনিকেশন এবং রিয়েল-টাইম ডাটা ট্রান্সফার অ্যাপ্লিকেশনগুলোতে ব্যবহৃত হয়, যেমন চ্যাট অ্যাপ্লিকেশন, স্টক মার্কেট অ্যাপ্লিকেশন, এবং গেমিং অ্যাপ্লিকেশন।
WebSocket এর প্রধান সুবিধা হলো এটি HTTP রিকোয়েস্টের মতো নতুন কানেকশন খুলে না, বরং একটি একক কানেকশন তৈরি করে যার মাধ্যমে বারবার ডাটা আদান-প্রদান সম্ভব।
WebSocket এর মূল বৈশিষ্ট্য:
- Full-Duplex Communication:
- WebSocket একে অপরকে একসাথে পাঠানোর অনুমতি দেয়। সার্ভার এবং ক্লায়েন্ট একে অপরকে ডাটা পাঠাতে পারে যখনই প্রয়োজন হয়, এবং এটি সম্পূর্ণ অপ্রতিরোধ্য।
- Persistent Connection:
- একবার কানেকশন স্থাপিত হলে তা সার্ভার এবং ক্লায়েন্টের মধ্যে দীর্ঘসময় ধরে চলে, নতুন HTTP কানেকশন তৈরি করার দরকার নেই।
- Low Latency:
- HTTP প্রোটোকলের তুলনায় WebSocket কম দেরিতে রেসপন্স করে, কারণ বার্তা বারবার হ্যান্ডশেক করতে হয় না।
- Scalable and Efficient:
- WebSocket সার্ভারটি সংযোগগুলিকে দীর্ঘসময় ধরে রাখতে সক্ষম, এবং ছোট, স্ন্যাপি ডাটাগুলি প্রেরণ করতে পারে, যা বায়ন্ডিং এবং ব্রডকাস্টিং অ্যাপ্লিকেশনগুলির জন্য উপযুক্ত।
WebSocket এর কাজ কীভাবে হয়?
WebSocket এর কাজের প্রক্রিয়াটি নিম্নরূপ:
- Handshake:
- ক্লায়েন্ট একটি HTTP রিকোয়েস্ট (WebSocket handshake) সার্ভারে পাঠায় এবং একে WebSocket কানেকশনে রূপান্তরিত করা হয়।
- Connection Establishment:
- সার্ভার যখন HTTP হ্যান্ডশেক রিকোয়েস্ট গ্রহণ করে, তখন একটি WebSocket কানেকশন স্থাপন করে। এর পরপরই সার্ভার এবং ক্লায়েন্ট উভয়েই একে অপরের সাথে ডাটা পাঠাতে পারে।
- Full-Duplex Communication:
- কানেকশন স্থাপন হওয়ার পর, সার্ভার এবং ক্লায়েন্ট একে অপরের সাথে ডাটা আদান-প্রদান করতে পারে, এবং এই ডাটা একসাথে উভয় পক্ষ থেকে পাঠানো এবং গ্রহণ করা যায়।
- Closure:
- যখন ক্লায়েন্ট অথবা সার্ভার একটি শেষ সিগন্যাল পাঠায়, তখন WebSocket কানেকশনটি বন্ধ হয়ে যায়।
Spring MVC তে WebSocket ব্যবহার করা:
Spring Framework WebSocket সমর্থন করে এবং Spring WebSocket এর মাধ্যমে আপনাকে সহজে রিয়েল-টাইম কমিউনিকেশন সেটআপ করতে সহায়তা করে। এখানে একটি Spring Boot WebSocket উদাহরণ দেখানো হলো।
Step 1: Maven Dependencies
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: ওয়েব অ্যাপ্লিকেশন তৈরির জন্য মৌলিক স্টার্টার।
Step 2: WebSocket Configuration Class
Spring WebSocket কনফিগার করতে একটি কনফিগারেশন ক্লাস তৈরি করুন।
WebSocketConfig.java:
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 হ্যান্ডলার ক্লাস তৈরি করা।
Step 3: WebSocket Handler Implementation
WebSocket হ্যান্ডলার হ'ল সেই অংশ যা WebSocket কানেকশন পরিচালনা করে এবং বার্তা প্রেরণ এবং গ্রহণ করে।
MyWebSocketHandler.java:
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: ক্লায়েন্টের সাথে কানেকশন বন্ধ হলে এটি কল করা হয়।
Step 4: Client-side WebSocket Code (HTML + JavaScript)
আপনি WebSocket কানেকশন ক্লায়েন্ট সাইডে JavaScript দিয়ে তৈরি করতে পারেন। এখানে একটি উদাহরণ দেওয়া হলো যেখানে একটি HTML পেজ ব্যবহারকারীর মেসেজ সার্ভারে পাঠায় এবং সার্ভার থেকে উত্তর গ্রহণ করে।
chat.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: সার্ভার থেকে আসা মেসেজ শো করা।
Step 5: Run the Application
- Spring Boot অ্যাপ্লিকেশন চালু করুন:
mvn spring-boot:runঅথবা আপনার IDE থেকেWebSocketConfigএবংMyWebSocketHandlerক্লাস চালিয়ে অ্যাপ্লিকেশনটি রান করুন। - ব্রাউজারে WebSocket Chat পেজে যান:
http://localhost:8080/chat।
Conclusion
Spring MVC তে WebSocket ব্যবহারের মাধ্যমে আপনি রিয়েল-টাইম ডাটা ট্রান্সফার করতে পারেন। এটি ক্লায়েন্ট এবং সার্ভারের মধ্যে স্থায়ী কানেকশন তৈরি করে এবং তা দিয়ে ডুয়াল-ডিরেকশনাল যোগাযোগ সম্ভব করে। Spring WebSocket কনফিগারেশন, হ্যান্ডলার এবং ক্লায়েন্ট সাইডের জন্য JavaScript কোডের মাধ্যমে আপনি সহজে রিয়েল-টাইম চ্যাট অ্যাপ্লিকেশন তৈরি করতে পারবেন।
Read more