WebSocket একটি পূর্ণ-দ্বৈত যোগাযোগ প্রোটোকল যা রিয়েল-টাইম ডেটা আদান-প্রদানের জন্য ক্লায়েন্ট এবং সার্ভারের মধ্যে একটি স্থায়ী সংযোগ স্থাপন করে। প্রথাগত HTTP অনুরোধের বিপরীতে, এই প্রোটোকল একটি একক সংযোগ স্থাপন করে এবং বারবার হ্যান্ডশেক ছাড়াই দ্বিমুখী ট্রান্সমিশনের জন্য এটি ব্যবহার করে। Mozilla Developer Network (2025)-এর মতে, WebSocket রিয়েল-টাইম অ্যাপ্লিকেশনে HTTP polling-এর তুলনায় লেটেন্সি 50% পর্যন্ত কমিয়ে দেয়।
মূল পয়েন্ট
WebSocket একটি যোগাযোগ প্রোটোকল যা TCP-র উপরে কাজ করে এবং ক্লায়েন্ট ও সার্ভারের মধ্যে একটি পূর্ণ-দ্বৈত চ্যানেল সরবরাহ করে। এটি 2011 সালে IETF দ্বারা RFC 6455 হিসাবে মানকীকৃত হয়েছিল এবং সমস্ত আধুনিক ব্রাউজার, মোবাইল প্ল্যাটফর্ম এবং সার্ভার ফ্রেমওয়ার্ক দ্বারা সমর্থিত।
HTTP-এর বিপরীতে, যেখানে ক্লায়েন্ট অনুরোধ শুরু করে এবং প্রতিক্রিয়া পায়, WebSocket সংযোগ স্থাপনের পরে উভয় পক্ষকে যেকোনো সময় বার্তা পাঠানোর অনুমতি দেয়। এটি এটিকে তাৎক্ষণিক বিতরণ প্রয়োজন এমন পরিস্থিতির জন্য আদর্শ করে তোলে: চ্যাট, বিজ্ঞপ্তি, সহযোগিতামূলক ডকুমেন্ট সম্পাদনা।
WebSocket প্রোটোকল প্রাথমিক হ্যান্ডশেকের জন্য HTTP পোর্ট 80 বা HTTPS পোর্ট 443 ব্যবহার করে, তারপরে এটি ন্যূনতম হেডার সহ নিজস্ব প্রোটোকলে সুইচ করে — HTTP-তে 800+ বাইটের পরিবর্তে মাত্র 2 বাইট। এই বৈশিষ্ট্যটি প্রচুর সংখ্যক বার্তার সাথে উল্লেখযোগ্য কর্মক্ষমতা সুবিধা প্রদান করে।
একটি WebSocket সংযোগ একটি HTTP আপগ্রেড অনুরোধ (Upgrade) দিয়ে শুরু হয়, তারপরে প্রোটোকল একটি বাইনারি ফ্রেম ফর্ম্যাটে সুইচ করে। ফ্রেমের আকার 2 বাইট থেকে 2^63 বাইট পর্যন্ত হয়, যা ছোট টেক্সট বার্তা এবং বড় বাইনারি ডেটা উভয়ের ট্রান্সমিশনের অনুমতি দেয়। প্রোটোকল বার্তা খণ্ডিতকরণ, ক্লায়েন্ট থেকে সার্ভারে ডেটা মাস্কিং এবং সংযোগ সক্রিয় রাখতে ping/pong সমর্থন করে।
WebSocket সংযোগ স্থাপন প্রক্রিয়ায় দুটি ধাপ রয়েছে: হ্যান্ডশেক এবং ডেটা স্থানান্তর। হ্যান্ডশেক ধাপে, ক্লায়েন্ট Upgrade: websocket হেডার সহ একটি HTTP অনুরোধ পাঠায়, এবং সার্ভার স্ট্যাটাস 101 Switching Protocols দিয়ে প্রোটোকল সুইচ নিশ্চিত করে। এর পরে, সংযোগ পূর্ণ-দ্বৈত ট্রান্সমিশন মোডে প্রবেশ করে।
WebSocket-এ প্রতিটি বার্তা ফ্রেমে বিভক্ত হয়। একটি ফ্রেমে একটি opcode (টেক্সট, বাইনারি ডেটা, বন্ধ, ping/pong), পেলোড দৈর্ঘ্য এবং ক্লায়েন্ট থেকে ডেটার জন্য একটি মাস্কিং কী থাকে। ফ্রেম খণ্ডিত করা যেতে পারে — নিয়ন্ত্রণ ফ্রেম (ping/pong) বার্তা খণ্ডের মধ্যে প্রেরণ করা যেতে পারে, যা দীর্ঘ স্থানান্তরের সময় সংযোগ টাইমআউট প্রতিরোধ করে।
const ws = new WebSocket('wss://example.com/chat')
ws.addEventListener('open', () => {
console.log('সংযোগ স্থাপিত হয়েছে')
ws.send('হ্যালো, সার্ভার!')
})
ws.addEventListener('message', (event) => {
console.log('গৃহীত:', event.data)
})
ws.addEventListener('close', () => {
console.log('সংযোগ বন্ধ হয়েছে')
})
উপরের উদাহরণে, ক্লায়েন্ট নিরাপদ URL wss:// উল্লেখ করে একটি WebSocket অবজেক্ট তৈরি করে। সংযোগ খোলার পরে, একটি স্বাগত বার্তা পাঠানো হয়, এবং বার্তা হ্যান্ডলার সার্ভার থেকে প্রতিক্রিয়া গ্রহণ করে। বন্ধ হলে, ক্লোজ হ্যান্ডলার সক্রিয় হয় — নেটওয়ার্ক বিঘ্নের ক্ষেত্রে পুনঃসংযোগের জন্য এটি গুরুত্বপূর্ণ।
WebSocket এবং HTTP-র মধ্যে প্রধান পার্থক্য হল ইন্টারঅ্যাকশন মডেল। HTTP একটি অনুরোধ-প্রতিক্রিয়া স্কিমায় কাজ করে: ক্লায়েন্ট অনুরোধ শুরু করে, সার্ভার প্রতিক্রিয়া ফেরত দেয় এবং সংযোগ বন্ধ হয়। অন্যদিকে, WebSocket একটি স্থায়ী চ্যানেল স্থাপন করে যার মাধ্যমে উভয় পক্ষ যেকোনো সময় ট্রান্সমিশন শুরু করতে পারে।
যে অ্যাপ্লিকেশনগুলির জন্য কম লেটেন্সি এবং ডেটার ধারাবাহিক ধারা প্রয়োজন, WebSocket উল্লেখযোগ্যভাবে বেশি কার্যকর। HTTP Long Polling — একটি বিকল্প যেখানে ডেটা উপলব্ধ না হওয়া পর্যন্ত সার্ভার অনুরোধ খোলা রাখে — সার্ভারে অতিরিক্ত লোড তৈরি করে এবং একাধিক সমবর্তী সংযোগের কারণে মেমরি খরচ বাড়ায়।
| প্যারামিটার | WebSocket | HTTP |
|---|---|---|
| মডেল | পূর্ণ-দ্বৈত | অনুরোধ-প্রতিক্রিয়া |
| হেডার | 2-14 বাইট | 400-800 বাইট |
| স্থায়ী সংযোগ | হ্যাঁ, একক | না, প্রতি অনুরোধে নতুন |
| লেটেন্সি | কম (1-5 ms) | উচ্চ (50-200 ms) |
| প্রোটোকল | ws:// বা wss:// | http:// বা https:// |
High Performance Browser Networking (Grigorik, O'Reilly) অনুযায়ী, WebSocket রিয়েল-টাইম পরিস্থিতিতে HTTP Long Polling-এর তুলনায় নেটওয়ার্ক লেটেন্সি 40-60% কমিয়ে দেয়, যখন বারবার হ্যান্ডশেক দূর করার কারণে সার্ভার লোড 3-5 গুণ কমে যায়।
এর কম লেটেন্সি এবং দ্বিমুখী যোগাযোগের কারণে, WebSocket বিস্তৃত অ্যাপ্লিকেশনগুলিতে ব্যবহৃত হয়। মূল পরিস্থিতিগুলির মধ্যে রয়েছে তাত্ক্ষণিক বার্তাপ্রেরণ, গেমে অবস্থা সিঙ্ক্রোনাইজেশন এবং আর্থিক সিস্টেমে বাজার ডেটা ট্রান্সমিশন।
WebSocket চ্যাট অ্যাপ্লিকেশনের জন্য ডি ফ্যাক্টো স্ট্যান্ডার্ড হয়ে উঠেছে। Slack, Telegram Web এবং WhatsApp Web-এর মতো প্ল্যাটফর্মগুলি তাত্ক্ষণিক বার্তা বিতরণের জন্য WebSocket ব্যবহার করে। প্রোটোকল একটি একক চ্যানেলের মাধ্যমে টেক্সট বার্তা এবং ফাইল উভয় পাঠানোর অনুমতি দেয়, যখন ping/pong মেকানিজম নিষ্ক্রিয়তার সময়কালেও সংযোগ সক্রিয় রাখে।
মাল্টিপ্লেয়ার ব্রাউজার এবং মোবাইল গেমগুলির খেলোয়াড়দের অবস্থা সিঙ্ক্রোনাইজ করার জন্য ন্যূনতম লেটেন্সি প্রয়োজন। WebSocket HTTP অনুরোধের বিলম্ব ছাড়াই রিয়েল টাইমে স্থানাঙ্ক, ক্রিয়া এবং ইভেন্ট প্রেরণ করে। Socket.IO এবং Colyseus-এর মতো ফ্রেমওয়ার্ক নিম্ন-স্তরের প্রোটোকল অপারেশনগুলিকে বিমূর্ত করে, স্বয়ংক্রিয় পুনঃসংযোগ এবং রুম যোগ করে।
ট্রেডিং টার্মিনাল এবং ট্রেডিং প্ল্যাটফর্মগুলি রিয়েল-টাইম কোট গ্রহণের জন্য WebSocket ব্যবহার করে। কয়েক মিলিসেকেন্ডের বিলম্ব মিলিয়ন ডলার খরচ করতে পারে, তাই আর্থিক API — যেমন Binance WebSocket Streams, Coinbase Pro — বাজার ডেটার জন্য WebSocket ইন্টারফেস সরবরাহ করে।
মোবাইল ডেভেলপমেন্টে, WebSocket নেটিভ API-এর মাধ্যমে ব্যবহৃত হয়: iOS-এ URLSessionWebSocketTask এবং Android-এ OkHttp WebSocket। Flutter-এর জন্য, web_socket_channel লাইব্রেরি রয়েছে, এবং React Native-এর জন্য — react-native-websocket। IoT ডিভাইস টেলিমেট্রি প্রেরণ এবং নিয়ন্ত্রণ কমান্ড গ্রহণের জন্য WebSocket ব্যবহার করে, কারণ প্রোটোকল ধ্রুবক HTTP polling-এর চেয়ে কম শক্তি খরচ করে।
আসুন Node.js ব্যবহার করে ws লাইব্রেরির সাথে একটি সার্ভার-সাইড উদাহরণ দেখি — জাভাস্ক্রিপ্টের জন্য WebSocket-এর সবচেয়ে জনপ্রিয় বাস্তবায়ন। সার্ভার সংযোগ গ্রহণ করে, বার্তা প্রক্রিয়া করে এবং সমস্ত সংযুক্ত ক্লায়েন্টের কাছে সেগুলি সম্প্রচার করে।
const WebSocket = require('ws')
const wss = new WebSocket.Server({ port: 8080 })
wss.on('connection', (ws) => {
console.log('নতুন ক্লায়েন্ট সংযুক্ত হয়েছে')
ws.on('message', (data) => {
console.log('গৃহীত:', data.toString())
ws.send('সার্ভার আপনার বার্তা পেয়েছে')
})
ws.on('close', () => {
console.log('ক্লায়েন্ট সংযোগ বিচ্ছিন্ন হয়েছে')
})
})
console.log('WebSocket সার্ভার পোর্ট 8080-এ শুরু হয়েছে')
সার্ভার পোর্ট 8080-এ একটি WebSocket.Server ইনস্ট্যান্স তৈরি করে এবং সংযোগের জন্য অপেক্ষা করে। প্রতিটি নতুন ক্লায়েন্টকে একটি পৃথক ws অবজেক্ট বরাদ্দ করা হয় যার মাধ্যমে সার্ভার পৃথক বার্তা পাঠাতে পারে। সমস্ত ক্লায়েন্টের কাছে বার্তা সম্প্রচার সংযোগের অ্যারের মাধ্যমে পুনরাবৃত্তি করে বাস্তবায়িত হয়। বিপুল সংখ্যক ক্লায়েন্টের (1000-এর বেশি) সাথে, ক্লাস্টারিং সমর্থন সহ লাইব্রেরি ব্যবহার করার পরামর্শ দেওয়া হয়, যেমন Socket.IO, যা Redis-ভিত্তিক স্কেলিং এবং স্বয়ংক্রিয় পুনঃসংযোগ যোগ করে।
wss.clients.forEach((client) => {
if (client.readyState === WebSocket.OPEN) {
client.send('সমস্ত অংশগ্রহণকারীর জন্য বার্তা')
}
})
পাঠানোর আগে readyState চেক করা বাধ্যতামূলক: যদি ক্লায়েন্ট ইতিমধ্যে সংযোগ বিচ্ছিন্ন হয়ে থাকে, তাহলে send কল করলে একটি ত্রুটি হবে। WebSocket.OPEN ফ্ল্যাগ নিশ্চিত করে যে সংযোগ সক্রিয় এবং বার্তা বিতরণ করা হবে।
iOS মোবাইল অ্যাপ্লিকেশনের জন্য, WebSocket URLSessionWebSocketTask-এর মাধ্যমে বাস্তবায়িত হয়, যা iOS 13 থেকে উপলব্ধ। সেশনটি wss:// প্রোটোকল URL সহ একটি টাস্ক তৈরি করে, তারপরে send এবং receive মেথড কল করা হয়। বার্তা গ্রহণ ক্রমাগত receive রিকার্সনের মাধ্যমে সংগঠিত করা যেতে পারে, যা পূর্ববর্তী বার্তা প্রক্রিয়া করার পরে পরবর্তী বার্তার জন্য অপেক্ষা করে, পুনঃসংযোগ ছাড়াই ধারাবাহিক ডেটা গ্রহণ নিশ্চিত করে। Android-এর জন্য, OkHttp WebSocket ব্যবহার করা হয়, যা onOpen, onMessage, onClosing এবং onClosed কলব্যাকের সাথে একটি অনুরূপ ইন্টারফেস প্রদান করে, সেইসাথে সংযোগ বিচ্ছিন্ন হলে স্বয়ংক্রিয় পুনঃসংযোগ প্রদান করে।
মোবাইল অ্যাপ্লিকেশনে WebSocket-এর সাথে কাজ করার সময়, জীবনচক্র ব্যবস্থাপনা বিবেচনা করা গুরুত্বপূর্ণ: যখন অ্যাপ ব্যাকগ্রাউন্ডে যায়, সিস্টেম সংযোগটি শেষ করতে পারে। iOS-এ, sceneDidBecomeActive ডেলিগেটের মাধ্যমে ফোরগ্রাউন্ডে ফিরে আসার সময় সংযোগ পুনঃস্থাপন করা আবশ্যক। Android-এ, সংযোগ বজায় রাখার জন্য Lifecycle-aware উপাদান বা Service ব্যবহার করা উচিত। অতিরিক্তভাবে, পুনঃসংযোগের জন্য এক্সপোনেনশিয়াল ব্যাকঅফ বাস্তবায়নের পরামর্শ দেওয়া হয় — প্রচেষ্টার মধ্যে ব্যবধান 1 থেকে 30 সেকেন্ড বাড়ানো — অস্থায়ী নেটওয়ার্ক সমস্যার সময় সার্ভারে অতিরিক্ত লোড তৈরি এড়াতে।
প্রায়শই জিজ্ঞাসিত প্রশ্ন
WebSocket একটি স্থায়ী পূর্ণ-দ্বৈত সংযোগ স্থাপন করে যেখানে উভয় পক্ষ যেকোনো সময় ডেটা পাঠাতে পারে। HTTP একটি অনুরোধ-প্রতিক্রিয়া স্কিমায় কাজ করে যেখানে প্রতিটি বিনিময়ের জন্য একটি নতুন সংযোগ এবং সম্পূর্ণ হেডার প্রয়োজন। WebSocket একটি একক TCP চ্যানেল এবং মাত্র 2-14 বাইটের হেডার ব্যবহার করে, যা লেটেন্সি নাটকীয়ভাবে হ্রাস করে।
WebSocket অনিরাপদ সংযোগের (ws://) জন্য পোর্ট 80 এবং সুরক্ষিত সংযোগের (wss://) জন্য পোর্ট 443 ব্যবহার করে। এটি অতিরিক্ত কনফিগারেশন ছাড়াই বেশিরভাগ প্রক্সি সার্ভার এবং কর্পোরেট ফায়ারওয়ালের মধ্য দিয়ে যেতে দেয়। TLS এনক্রিপশনের কারণে উত্পাদন পরিবেশের জন্য পোর্ট 443 সুপারিশ করা হয়।
হ্যাঁ, WebSocket সমস্ত মোবাইল প্ল্যাটফর্মে সমর্থিত। iOS-এ, নেটিভ URLSessionWebSocketTask ক্লাস iOS 13 থেকে উপলব্ধ। Android-এ — OkHttp WebSocket ক্লাস এবং স্ট্যান্ডার্ড java.net.WebSocket। React Native-এর জন্য, react-native-websocket লাইব্রেরি বিদ্যমান।
WebSocket Secure হল প্রোটোকলের সুরক্ষিত সংস্করণ যা TLS-এর উপরে কাজ করে। সমস্ত ডেটা HTTPS-এর মতোই এনক্রিপ্ট করা হয়। উত্পাদন অ্যাপ্লিকেশনের জন্য WSS বাধ্যতামূলক, বিশেষ করে WebSocket-এর মাধ্যমে প্রমাণীকরণ টোকেন বা ব্যক্তিগত ডেটা প্রেরণের সময়।
প্রধান বিকল্পগুলি হল: HTTP Long Polling (সার্ভার অনুরোধ খোলা রাখে), Server-Sent Events (সার্ভার থেকে একমুখী স্ট্রিম), এবং WebRTC Data Channel (পিয়ার-টু-পিয়ার যোগাযোগ)। Server-Sent Events বাস্তবায়নে সহজ কিন্তু ক্লায়েন্ট থেকে সার্ভারে পাঠানো সমর্থন করে না।
সারসংক্ষেপ
আমরা একটি মোবাইল অ্যাপ্লিকেশন টার্নকি তৈরি করব
IT Sectr 2017 সাল থেকে স্টার্টআপ এবং ব্যবসার জন্য iOS এবং Android অ্যাপ্লিকেশন তৈরি করে। আমরা আপনাকে পরামর্শ দেব এবং সেরা সমাধান প্রস্তাব করব।
আরও পড়ুন