WebSocket على C#: إنشاء تطبيقات الوقت الفعلي باستخدام .NET

مدرب بايثون أونلاين للمبتدئين

تعلم Python بسهولة دون إرهاق نظري. حل مهام عملية مع التحقق التلقائي واكتب الكود مباشرة في المتصفح.

ابدأ الدورة

مقدمة إلى WebSocket في C# للتطبيقات في الوقت الفعلي

تتطلب تطبيقات الويب الحديثة بشكل متزايد نقلًا فوريًا للبيانات بين العميل والخادم. بروتوكول HTTP التقليدي، الذي يعمل وفق مخطط "طلب-استجابة"، غير فعال للمهام التي تكون فيها زمن الوصول المنخفض والتحديثات المستمرة للمعلومات مهمة: الدردشات عبر الإنترنت، أسعار الأسهم، الألعاب متعددة اللاعبين، أنظمة المراقبة. يأتي WebSocket للإنقاذ — وهو بروتوكول يوفر اتصالًا ثنائي الاتجاه دائمًا.

في نظام C# (.NET)، يتوفر تنفيذ WebSocket من خلال الفئات المضمنة في مساحة الاسم System.Net.WebSockets ومن خلال مكتبة SignalR عالية المستوى. في هذه المقالة، سنغطي كلا الأسلوبين، ونكتب أمثلة عملية، ونناقش الميزات المعمارية للتطبيقات في الوقت الفعلي. ستكون المادة مفيدة لمطوري .NET المبتدئين وذوي الخبرة على حد سواء.



أساسيات WebSocket: كيف يعمل في C#

WebSocket هو بروتوكول يقوم، بعد مصافحة HTTP أولية (طلب ترقية)، بتحويل الاتصال إلى وضع ثنائي الاتجاه دائم. في C#، يعتمد العمل مع WebSocket على البرمجة غير المتزامنة باستخدام الكلمتين المفتاحيتين async و await.



إنشاء خادم WebSocket بسيط في C#

لنلقِ نظرة على مثال أساسي لخادم يقبل اتصالات WebSocket ويعيد إرسالها إلى العميل. لهذا، نستخدم الفئة المضمنة HttpListener أو Kestrel (ASP.NET Core). فيما يلي مثال يعتمد على ASP.NET Core.

// Startup.cs or Program.cs (minimal API)var builder = WebApplication.CreateBuilder(args);var app = builder.Build();

app.UseWebSockets();

app.Map("/ws", async (HttpContext context) =>{ if (context.WebSockets.IsWebSocketRequest) { using var webSocket = await context.WebSockets.AcceptWebSocketAsync(); await Echo(webSocket); } else { context.Response.StatusCode = 400; }});

async Task Echo(WebSocket webSocket){ var buffer = new byte[1024 * 4]; while (webSocket.State == WebSocketState.Open) { var result = await webSocket.ReceiveAsync( new ArraySegment<byte>(buffer), CancellationToken.None); if (result.MessageType == WebSocketMessageType.Close) { await webSocket.CloseAsync( WebSocketCloseStatus.NormalClosure, "Closing", CancellationToken.None); } else { // Send data back (echo) await webSocket.SendAsync( new ArraySegment<byte>(buffer, 0, result.Count), result.MessageType, result.EndOfMessage, CancellationToken.None); } }}

app.Run();

يوضح الكود الآلية الأساسية: AcceptWebSocketAsync يقوم بترقية طلب HTTP إلى WebSocket، وتوفر الطريقتان ReceiveAsync و SendAsync تبادلًا غير متزامن للبيانات. من المهم التعامل مع حالة الاتصال وإغلاقه بشكل صحيح.



عميل WebSocket في C#

جانب العميل بسيط أيضًا. استخدم الفئة ClientWebSocket:

using System.Net.WebSockets;

async Task ConnectAndSend(){ using var client = new ClientWebSocket(); await client.ConnectAsync(new Uri("ws://localhost:5000/ws"), CancellationToken.None);

var message = "Hello, WebSocket!"; var bytes = Encoding.UTF8.GetBytes(message); await client.SendAsync(new ArraySegment<byte>(bytes), WebSocketMessageType.Text, true, CancellationToken.None);

var buffer = new byte[1024]; var result = await client.ReceiveAsync( new ArraySegment<byte>(buffer), CancellationToken.None); var response = Encoding.UTF8.GetString(buffer, 0, result.Count); Console.WriteLine($"Re

المدونات

توصيات الكتب