
تتطلب ميزات الويب في الوقت الفعلي إماويب سوكيتسأوالأحداث المرسلة من الخادم (SSE). كلاهما يدفعان البيانات من الخادم إلى العميل، لكنهما يعملان بشكل مختلف. في عام 2026، اكتسبت SSE شعبية لتدفق الذكاء الاصطناعي بينما تظل WebSockets ضرورية للاتصال ثنائي الاتجاه. يشرح هذا الدليل كلاً من الكود ويساعدك على الاختيار.
📋 Table of Contents
WebSockets: دوبلكس كامل
تقوم WebSockets بإنشاء اتصال TCP مستمر. يمكن لكل من العميل والخادم إرسال الرسائل في أي وقت — إرسال مزدوج حقيقي. يستخدم لـ: تطبيقات الدردشة، والأدوات التعاونية، والألعاب المباشرة، ومنصات التداول.
# FastAPI WebSocket server
from fastapi import FastAPI, WebSocket
app = FastAPI()
connected = []
@app.websocket('/ws')
async def websocket_endpoint(ws: WebSocket):
await ws.accept()
connected.append(ws)
try:
while True:
data = await ws.receive_text()
# Broadcast to all clients
for client in connected:
await client.send_text(f'Message: {data}')
except:
connected.remove(ws)
// Browser WebSocket client
const ws = new WebSocket('wss://example.com/ws');
ws.onopen = () => console.log('Connected');
ws.onmessage = (e) => console.log('Received:', e.data);
ws.onerror = (e) => console.error('Error:', e);
ws.onclose = () => console.log('Disconnected');
// Send message
ws.send('Hello server!');
الأحداث المرسلة من الخادم (SSE): الدفع في اتجاه واحد
يستخدم SSE اتصال HTTP عاديًا حيث يقوم الخادم ببث الأحداث. لا يمكن للعميل إرسال البيانات مرة أخرى (استخدم طلبات HTTP منفصلة لذلك). إعادة الاتصال تلقائيًا عند قطع الاتصال. يعمل عبر تعدد إرسال HTTP/2. يستخدم لـ: البث المباشر، وتدفق استجابة الذكاء الاصطناعي، والإشعارات، وأشرطة التقدم.
# FastAPI SSE server
from fastapi import FastAPI
from fastapi.responses import StreamingResponse
import asyncio
app = FastAPI()
@app.get('/stream')
async def stream():
async def event_generator():
for i in range(10):
yield f'data: Message {i}\n\n'
await asyncio.sleep(1)
return StreamingResponse(
event_generator(),
media_type='text/event-stream'
)
// Browser SSE client
const evtSource = new EventSource('/stream');
evtSource.onmessage = (e) => {
console.log('Received:', e.data);
};
evtSource.onerror = (e) => {
console.error('Error:', e);
// EventSource auto-reconnects after error
};
// Close when done
evtSource.close();
تدفق الذكاء الاصطناعي مع SSE (نمط 2026)
LLM APIs (Claude, OpenAI) تبث الاستجابات عبر SSE. هذا هو النمط لإعادة توجيه تدفق Claude إلى المتصفح.
import anthropic
from fastapi.responses import StreamingResponse
client = anthropic.Anthropic()
@app.post('/ask')
async def ask(question: str):
async def generate():
with client.messages.stream(
model='claude-sonnet-4-5',
max_tokens=1024,
messages=[{'role': 'user', 'content': question}]
) as stream:
for text in stream.text_stream:
yield f'data: {text}\n\n'
yield 'data: [DONE]\n\n'
return StreamingResponse(generate(), media_type='text/event-stream')
مقارنة
- ويب سوكيت:ثنائي الاتجاه، TCP مستمر، ثنائي أو نصي، إعادة الاتصال يدويًا
- إس إس إي:من خادم إلى عميل فقط، HTTP، نص فقط، إعادة الاتصال التلقائي، أبسط
- الحمل الزائد لـ WebSockets:إعداد أثقل (ترقية المصافحة، إدارة الحالة)
- الحمل SSE:الحد الأدنى – يعمل مع أي خادم HTTP، متوافق مع CDN
متى تستخدم أي
- ويب سوكيت:الدردشة، والألعاب متعددة اللاعبين، والتحرير التعاوني (نمط مستندات Google)
- إس إس إي:بث استجابة الذكاء الاصطناعي، والموجزات المباشرة، والإشعارات، وتحديثات التقدم
- ولا :يعد الاقتراع كل 30 ثانية أو أكثر أبسط وغالبًا ما يكون كافيًا للتحديثات منخفضة التردد
الخلاصة
في عام 2026، يعد SSE هو الاختيار الصحيح لمعظم ميزات الوقت الفعلي – أبسط، ويعمل عبر HTTP/2، ومتوافق مع CDN، ومثالي لبث الذكاء الاصطناعي. اختر WebSockets فقط عندما تحتاج إلى اتصال حقيقي ثنائي الاتجاه. ابدأ بـ SSE وقم بالترقية إلى WebSockets إذا وصلت إلى حدوده.
🔗 Share this article
✍️ Leave a Comment