SSE (Server-Sent Events) ایک W3C معیار ہے جو سرور کو ایک طرفہ موڈ میں ایک HTTP کنیکشن کے ذریعے کلائنٹ کو سٹریمنگ ڈیٹا بھیجنے کی اجازت دیتا ہے۔ WebSocket کے برعکس، SSE عام HTTP پر کام کرتا ہے اور کلائنٹ کی جانب کسی خاص پروٹوکل یا لائبریری کی ضرورت نہیں ہے۔ W3C HTML Living Standard (2025) وضواحات کے مطابق، EventSource API تمام جدید براؤزرز میں تساوجرڈ ہے، جن میں Chrome، Firefox، Safari اور Edge شامل ہیں۔
اهم نکات
SSE (Server-Sent Events) ایک ٹیکنالوجی ہے جو ایک ویب سرور کو کنیکشن قائم کرنے کے بعد کسی بھی وقت کلائنٹ کو ڈیٹا بھیجنے کی اجازت دیتی ہے۔ اسے WHATWG کے ذریعے HTML Living Standard کے حصہ کے طور پر معیاری بنایا گیا ہے اور MIME قسم text/event-stream استعمال کرتی ہے۔ SSE ایک پیغام شناسندہ، واقعے کی قسم اور دوبارہ منصل ہونے میں تاخیر متعین کرنے کی صلاحیت کے ساتھ متن ڈیٹا کی منتقلی کی حمایت کرتی ہے۔
WebSocket کے برعکس جسے ایک دو طرفہ پروٹوکل اور اپ گیڈ درخواست کی ضرورت ہے، SSE عام HTTP پر کام کرتا ہے۔ سرور Content-Type: text/event-stream ہیڈر مقرر کرتا ہے، ڈیٹا چنکوں میں بھیجتا ہے اور کنیکشن کو کھولا رکھتا ہے۔ کلائنٹ براؤزر کے EventSource API کے ذریعے ڈیٹا حاصل کرتا ہے، جو خودکار طور پر سٹریم کو پارس کرتا ہے اور واقعات پیدا کرتا ہے۔
CanIUse (2025) کے مطابق، EventSource API عالمی سطح پر 97.5% براؤزرز میں تساوجرڈ ہے۔ یہ Internet Explorer اور کچھ موبائل براؤزرز (ورزن 7.0 سے پہلے Samsung Internet) میں تساوجرڈ نہیں ہے۔ ان ماملوں کے لیے، پولی فل موجود ہیں جو XHR سٹریمنگ کے ذریعے EventSource کی نقل کرتے ہیں۔ SSE HTTP/1.1 پائپ لائننگ کے ساتھ کام نہیں کرتا لیکن HTTP/2 سرور پش کے ساتھ مکمل طور پر مطابق ہے۔
SSE کو 2009 میں Server-Sent DOM Events کے نام سے HTML5 وضواحات کے حصہ کے طور پر تجویز کیا گیا تھا۔ پہلا نفاذ Opera 9.0 میں، پھر Firefox 6.0 (2011)، Chrome 9.0 (2011) اور Safari 5.0 (2010) میں ظاہر ہوا۔ 2015 میں، وضواحات کو HTML Living Standard کے ایک علاحدہ سیکشن میں منتقل کر دیا گیا۔ ایک دہائے کی تاریخ کے باوجود، SSE اپنی ایک طرفہ نیچر کے کارڣ WebSocket سے کم مقبول ہے۔
SSE کا وظیفہ کا طریقہ مندرجہ ذیل ہے: کلائنٹ سرور انڈ پائنٹ کے URL کے ساتھ EventSource کی ایک مثال تیار کرتا ہے۔ براؤزر Accept: text/event-stream ہیڈر کے ساتھ GET درخواست بھیجتا ہے۔ سرور حالت 200 OK اور Content-Type: text/event-stream ہیڈر کے ساتھ جواب دیتا ہے، پھر event-stream فارمیٹ میں ڈیٹا بھیجنا شروع کرتا ہے۔ کنیکشن اس وقت تک کھولا رہتا ہے جب تک سرور ختم کا سیگنل نہیں بھیجتا یا کلائنٹ close() کو کال نہیں کرتا۔
سرور کی جانب، ڈیٹا چنکوں میں (chunked transfer encoding) بھیجا جاتا ہے۔ ہر ڈیٹا چنک ایک متن پیغام ہے جس میں میدان کی لائینز (event, data, id, retry) ہوتی ہیں۔ سرور کسی بھی وقت پیغامات بھیج سکتا ہے، جو SSE کو اطلاعات اور حالت کی تازہ کرنے کے لیے موزوں بناتا ہے۔ کنیکشن کو WebSocket کی طرح مسلسل ہارٹبیٹ پیکیٹ کے تبادلے کی ضرورت نہیں ہے، حالاں کہ retry میدان دوبارہ منصل ہونے کی تکرار کو کنٹرول کرتا ہے۔
کارکردگی کے ٹیسٹ (2024) کے مطابق، SSE 256 بائٹ کے پیغام کے حجم کے ساتھ فی کنیکشن 10,000 پیغامات فی سیکنڈ تک کا ثرو پٹ فراہم کرتا ہے۔ سرور کی جانب، ہر SSE کنیکشن تقریبنا 5–10 KB میمری استعمال کرتا ہے، جو 1 GB RAM کے ساتھ ایک سرور کو 50,000+ بہالتور کنیکشنز کی حمایت کہ سکتا ہے۔ بائنری پروٹوکل کی غیر موجودگی کے کارڣ یہ WebSocket سے نمایاں طور پر کم ہے۔
text/event-stream فارمیٹ ایک سادہ متن پروٹوکل ہے جہاں ہر پیغام نئی لائن کے حروف سے علاحد نامزد میدانوں پر مشتمل ہہے۔ ہر میدان کا فارمیٹ «میدان کا نام: قیمت» ہے۔ پیغام دو نئی لائن کے حروف (\n\n) سے علاحد کیے جاتے ہیں۔
تساوجرڈ شدہ میدان: event (واقعے کی قسم، پہلے سے مقرر message)، data (ڈیٹا سٹرنگ، کائی لائنوں پر مشتمل ہو سکتی ہے)، id (آخری واقعے کا شناسندہ، Last-Event-ID میں محفوظ)، retry (ملی سیکنڈ میں دوبارہ منصل ہونے کا وقت)۔ تبصرے نقطہ (،) سے شروع ہوتے ہیں اور پارسر کے ذریعے نظرانداز کیے جاتے ہیں، لیکن ہارٹبیٹ کے لیے استعمال کیے جا سکتے ہیں۔
| میدان | لازمی | مقصد |
|---|---|---|
| event | نہیں | واقعے کی قسم (پہلے سے مقرر message) |
| data | ہاں | پیغام کھ ڈیٹا سٹرنگ |
| id | نہیں | Last-Event-ID کے لیے واقعے کا شناسندہ |
| retry | نہیں | ملی سیکنڈ میں دوبارہ منصل ہونے میں تاخیر |
: heartbeat comment
event: update
data: {"user": "Alice", "action": "typing"}
id: 1001
event: notification
data: {"type": "info", "text": "New version available"}
data: {"type": "action", "url": "/upgrade"}
retry: 3000
event: close
data: Session ended
EventSource API SSE حاصل کرنے کے لیے ایک مضمن براؤزر انٹرفیس ہے۔ کنیکشن بنانے کے لیے، انڈ پائنٹ کے URL کے ساتھ کنسٹرکٹر کو کال کرنا کافی ہے۔ EventSource خودکار طور پر کنیکشن قائم کرتا ہے، دوبارہ منصل ہونے کا انتظام کرتا ہے اور آنے والے پیغامات کو JavaScript واقعات میں پارس کرتا ہے۔
EventSource کے واقعات: open (کنیکشن قائم ہوا)، message (واقعے کی وضاحت کے بغیر پیغام موصول)، error (کنیکشن میں خرابی)۔ کسٹم واقعات (event: custom) کے لیے، آپ واقعے کے نام کے ساتھ addEventListener استعمال کر سکتے ہیں۔ EventSource دوبارہ منصل ہونے پر خودکار طور پر Last-Event-ID ہیڈر بھیجتا ہے، جو سرور کو سٹریم کو جہاں سے رکا گیا تھا وہاں سے دوبارہ شروع کرنے کی اجازت دیتا ہے۔
MDN دستاویز (2025) کے مطابق، EventSource CORS اور اسنادے سند کی منتقلی (withCredentials) کی حمایت کرتا ہے۔ EventSource کسٹم ہیڈرز یا درخواست کا بڈی بھیجنے کے لیے موزوں نہیں ہے — fetch + ReadableStream کے ذریعے دستی نفاذ کی ضرورت ہے۔ EventSource بائنری ڈیٹا کی حمایت نہیں کرتا — صرف متن اور JSON۔
const eventSource = new EventSource('/api/events/stream');
eventSource.addEventListener('open', () => {
console.log('SSE کنیکشن کھول گیا');
});
eventSource.addEventListener('message', (event) => {
const data = JSON.parse(event.data);
console.log('موصول:', data);
renderUpdate(data);
});
eventSource.addEventListener('notification', (event) => {
const notification = JSON.parse(event.data);
showNotification(notification.text);
});
eventSource.addEventListener('error', (error) => {
console.error('SSE خرابی:', error);
// براؤزر خودکار دوبارہ منصل ہوجاتا ہے
});
// کنیکشن بند کریں
eventSource.close();
SSE اور WebSocket ریال ٹائم مواصلات کے لیے مختلف ٹیکنالوجیز ہیں، ہر ایک کی اپنی طرفداری ہے۔ WebSocket دو طرفہ ڈیٹا کے تبادلے (چیٹس، گیمز، مشترکہ ترمیم) کے لیے موزوں ہے، جبکہ SSE سرور سے کلائنٹ کی طرف ایک طرفہ بہاو (اطلاعات، خبر کے فیڈز، ٹائکرز) کے لیے ہے۔
بنیادی فرق یہ ہے کہ WebSocket کو HTTP/1.1 سے WebSocket پروٹوکل (ws://) میں اپ گیڈ درخواست کی ضرورت ہے، جو کارپوریٹ پراکسی کے ذریعے بلاک کیا جا سکتا ہے۔ SSE عام HTTP پر کام کرتا ہے، کسی بھی پراکسی سے گزرتا ہے اور سرور کو کسی خاص ترتیب کی ضرورت نہیں ہے۔ SSE کو نفاذ کرنا بھی آسان ہے — سرور کو کسی اضافی لائبریری کی ضرورت نہیں، صرف HTTP جواب کو صحیح طور پر ترتیب دینا ہے۔
موازناتی ٹیسٹ (2024) کے مطابق، ایک سرور پروسیس پر SSE سادہ پروٹوکل کے کارڣ WebSocket کے مقابلے 30–50% زیادہ کنیکشنز کی حمایت کرتا ہے۔ تاہم، SSE میں اعلی لیٹینسی (50–200 ms بنام 10–50 ms WebSocket) ہے کیونکہ SSE مکمل دو طرفہ بائنری فریمز والے کے بجائے چنکڈ HTTP استعمال کرتا ہے۔
| خاصیت | SSE | WebSocket |
|---|---|---|
| سمت | سرور → کلائنٹ | دو طرفہ |
| پروٹوکل | HTTP (text/event-stream) | ws:// / wss:// (RFC 6455) |
| براؤزرز | 97.5% (مضمن EventSource) | 97% (مضمن WebSocket) |
| ڈیٹا | صرف متن / JSON | متن + بائنری (Blob, ArrayBuffer) |
| پراکسی کا انتظام | کسی بھی پراکسی سے گزرتا ہے | پراکسی ترتیب کی ضرورت |
| دوبارہ منصل ہونا | خودکار (براؤزر) | دستی نفاذ |
| تاریخ | Last-Event-ID | کوئی مضمن تاریخ نہیں |
سرور پر SSE کا نفاذ لائبریریوں کی ضرورت نہیں ہے — صرف صحیح HTTP ہیڈرز مقرر کریں اور text/event-stream فارمیٹ میں ڈیٹا بھیجیں۔ آئیں مضمن http ماڈیول استعمال کرکے Node.js میں ایک مثال دیکھیں۔ سرور Content-Type اور Cache-Control ہیڈرز مقرر کرتا ہے، پھر ہر N سیکنڈ کے بعد پیغامات بھیجتا ہے۔
MDN Web Docs (2025) کے مطابق، SSE کے لیے ضروری ہیڈرز ہیں: Content-Type: text/event-stream, Cache-Control: no-cache اور Connection: keep-alive۔ Cache-Control کے بغیر، براؤزر SSE سٹریم کو کیش کر سکتا ہے، جو ترسیل کو روک دے گا۔ Connection: keep-alive براؤزر کو واضح طور پر کنیکشن کو کھولا رکھنے کا حکم دیتا ہے۔
const http = require('http');
http.createServer((req, res) => {
res.writeHead(200, {
'Content-Type': 'text/event-stream',
'Cache-Control': 'no-cache',
'Connection': 'keep-alive'
});
let eventId = 0;
const interval = setInterval(() => {
eventId++;
res.write(`id: ${eventId}\n`);
res.write(`event: update\n`);
res.write(`data: {"time": "${new Date().toISOString()}", "id":${eventId}}\n\n`);
}, 2000);
req.on('close', () => {
clearInterval(interval);
});
}).listen(3000);
from flask import Response, Flask
import time
import json
app = Flask(__name__)
@app.route('/stream')
def stream():
def generate():
event_id = 0
while True:
event_id += 1
data = json.dumps(
{'ticker': 'AAPL', 'price': 150.25})
yield f'id: {event_id}\nevent: price\ndata: {data}\n\n'
time.sleep(1)
return Response(generate(),
mimetype='text/event-stream')
موبائل ایپس میں SSE کا استعمال iOS اور Android کے لیے مقامی EventSource نفاذ کی کمی کے کارڣ محدود ہے۔ موبائل پلیٹ فارمز پر، SSE تیسری جانب کی لائبریریوں کے ذریعے نفاذ کیا جاتا ہے: iOS پر — URLSession کے ساتھ NSURLProtocol کے ذریعے، Android پر — OkHttp کے ساتھ SSE حمایت (okhttp-sse) کے ذریعے۔ React Native اور Flutter کے لیے، ایسے پیکیج موجود ہیں جو EventSource کی نقل کرتے ہیں۔
iOS پر، مقامی SSE نفاذ URLSessionDataDelegate کے ذریعے ممکن ہے۔ urlSession(_:dataTask:didReceive:) میثوڈ میں ڈیٹا موصول ہونے پر، ایپ ایک بفر جمع کرتا ہے اور event-stream فارمیٹ کو دستی طور پر پارس کرتا ہے۔ iOS ڈیویلپمنٹ بلاگ (2024) کے مطابق، ہارٹبیٹ پیکیٹز کی غیر موجودگی کے کارڣ iOS پر SSE کے ساتھ بیٹری کی کھپت مسلسل WebSocket کنیکشن کے مقابلے 40% کم ہے۔
Android پر، OkHttp SSE سٹریمز کی سبسکرائب کے لیے EventSource.Factory کلاس فراہم کرتا ہے۔ Android ایپس FCM دستیاب نہ ہونے پر اطلاعات کے لیے، یا پس منظر میں ڈیٹا سنک کے لیے SSE استعمال کر سکتے ہیں۔ Android پر SSE طویل عمر والے پس منظر کاموں کے لیے WorkManager کے ساتھ اچھی طرح کام کرتا ہے۔ OkHttp دستاویز (2025) کے مطابق، okhttp-sse کسٹم لسنر کے ساتھ خودکار دوبارہ منصل ہونے کی حمایت کرتا ہے۔
اکثر پوچے جانے والے سوالات
SSE HTTP پر ایک طرفہ منتقلی (سرور → کلائنٹ) ہے، کلائنٹ پر لائبریری کی ضرورت نہیں ہے۔ WebSocket بائنری پروٹوکل کے ساتھ دو طرفہ منتقلی ہے۔ SSE کو نفاذ کرنا آسان ہے، WebSocket ان کاموں کے لیے موزوں ہے جہاں کلائنٹ بھی ڈیٹا بھیجتا ہے۔
نہیں، SSE صرف متن ڈیٹا منتقل کرتا ہے۔ بائنری ڈیٹا (تصاویر، آڈیو) کے لیے Base64 اینکوڈنگ کی ضرورت ہے، جو حجم کو 33% تک بڑھا دیتی ہے۔ بائنری بہاو کے لیے WebSocket استعمال کرنا بہتر ہے۔
EventSource ٹوٹنے پر خودکار طور پر دوبارہ منصل ہوجاتا ہے۔ تاخیر کا وقت سٹریم میں retry فیلڈ (پہلے سے مقرر 1000 ms) کے ذریعے مقرر کیا جاتا ہے۔ دوبارہ منصل ہونے پر، براؤزر Last-Event-ID ہیڈر بھیجتا ہے، جو سرور کو سٹریم کو جہاں سے رکا گیا تھا وہاں سے بحال کرنے کی اجازت دیتا ہے۔
ہر براؤزر کی ایک ڈومین پر بہالتور HTTP کنیکشن کی تعداد پر ایک حد ہے۔ HTTP/1.1 کے لیے — فی ڈومین 6‘ کنیکشنز، HTTP/2 کے لیے — 100 تک۔ SSE ایک کنیکشن استعمال کرتا ہے، اس لیے دیگر درخواستوں کے ساتھ کوئی مسابقت نہیں ہیے۔
SSE صرف پیغامات موصول کرنے (آنے والے) کے لیے موزوں ہے۔ پیغامات بھیجنے (جانے والے) کے لیے ایک علاحدہ HTTP درخواست (POST) کی ضرورت ہے۔ ایک مکمل چیٹ کے لیے، ایک کنیکشن میں دو طرفہ مواصلات کے لیے WebSocket یا Socket.IO استعمال کرنا زیاده آسان ہے۔
خلاصہ
ہم ایک موبائل ایپلیکیشن ٹرنکی تیار کریں گے
IT Sectr 2017 سے اسٹارٹ اپس اور کاروبار کے لیے iOS اور Android ایپلیکیشنز بناتا ہے۔ ہم آپ کو مشورہ دیں گے اور بہترین حل تجویز کریں گے۔
مزید پڑھیں