C# पर WebSocket: वास्तविक प्रोजेक्ट और उन्नत तकनीकें

शुरुआती लोगों के लिए ऑनलाइन Python प्रशिक्षक

Python आसानी से सीखें बिना सिद्धांत के बोझ के। स्वचालित जांच के साथ व्यावहारिक कार्य हल करें और ब्राउज़र में सीधे कोड लिखें।

पाठ्यक्रम शुरू करें

C# पर WebSocket: प्रोटोटाइप से प्रोडक्शन तक — रियल-टाइम एप्लिकेशन की उन्नत तकनीकें

\n\n

System.Net.WebSockets या SignalR जैसी लाइब्रेरीज़ के साथ C# पर WebSocket का मानक कार्यान्वयन चैट और सूचनाओं के बुनियादी कार्यों को हल करता है। हालांकि, जब आवश्यकताएं "Hello, World" से आगे बढ़ती हैं, तो डेवलपर को स्केलिंग, सुरक्षा सुनिश्चित करने, कस्टम रूटिंग और प्रदर्शन अनुकूलन की आवश्यकता का सामना करना पड़ता है। इस लेख में, हम .NET में WebSocket के साथ काम करने की उन्नत तकनीकों पर चर्चा करेंगे जो आपको विश्वसनीय और उच्च-लोड रियल-टाइम सिस्टम बनाने में सक्षम बनाएंगी।

\n\n

1. स्केलेबल WebSocket सर्वर की आर्किटेक्चर: पैटर्न और क्लस्टरीकरण

\n\n

मानक WebSocket की एक मुख्य सीमा किसी विशिष्ट प्रक्रिया इंस्टेंस से कनेक्शन का जुड़ाव है। स्केलिंग (क्षैतिज) करते समय, सर्वर A पर भेजा गया संदेश सर्वर B से जुड़े क्लाइंट तक नहीं पहुंचेगा। इस समस्या को हल करने के लिए दो दृष्टिकोणों का उपयोग किया जाता है:

\n\n
    \n
  • केंद्रीकृत बैकप्लेन (Backplane): सर्वरों के बीच संदेशों के आदान-प्रदान के लिए Redis Pub/Sub, RabbitMQ या Azure SignalR Service का उपयोग करना।
  • \n
  • स्टिकी सेशन (Sticky Sessions): बैलेंसर क्लाइंट के अनुरोधों को हमेशा एक ही सर्वर पर भेजता है। कम विश्वसनीय तरीका, क्योंकि नोड के विफल होने पर उसके सभी क्लाइंट कनेक्शन खो देते हैं।
  • \n
\n\n

StackExchange.Redis और System.Net.WebSockets का उपयोग करके Redis पर कस्टम बैकप्लेन के कार्यान्वयन का एक उदाहरण देखें।

\n\n
using StackExchange.Redis;\nusing System.Net.WebSockets;\nusing System.Text;\n\npublic class RedisBackplaneManager\n{\n    private readonly ConnectionMultiplexer _redis;\n    private readonly ISubscriber _subscriber;\n    private readonly ConcurrentDictionary<string, WebSocket> _connections;\n\n    public RedisBackplaneManager(string redisConnectionString)\n    {\n        _redis = ConnectionMultiplexer.Connect(redisConnectionString);\n        _subscriber = _redis.GetSubscriber();\n        _connections = new ConcurrentDictionary<string, WebSocket>();\n        \n        // चैनल "websocket:messages" की सदस्यता लें\n        _subscriber.Subscribe("websocket:messages", (channel, message) => {\n            var data = Encoding.UTF8.GetString(message);\n            // संदेश पार्स करें (प्रारूप मान लें: "connectionId:payload")\n            var parts = data.Split(':', 2);\n            if (parts.Length == 2 && _connections.TryGetValue(parts[0], out var ws))\n            {\n                ws.SendAsync(new ArraySegment<byte>(Encoding.UTF8.GetBytes(parts[1])), \n                    WebSocketMessageType.Text, true, CancellationToken.None);\n            }\n        });\n    }\n\n    public async Task SendToClientAsync(string connectionId, string message)\n    {\n        // Redis में प्रकाशित करें ताकि सभी सर्वरों को संदेश मिले\n        var payload = $"{connectionId}:{message}";\n        await _subscriber.PublishAsync("websocket:messages", payload);\n    }\n\n    public void AddConnection(string id, WebSocket ws) => _connections.TryAdd(id, ws);\n    public void RemoveConnection(string id) => _connections.TryRemove(id, out _);\n}
\n\n

2. कस्टम प्रोटोकॉल और रूटिंग: WebSocket को RPC-ट्रांसपोर्ट के रूप में

\n\n

अक्सर केवल टेक्स्ट भेजना ही नहीं, बल्कि WebSocket के माध्यम से रिमोट प्रक्रियाओं (RPC) को कॉल करना भी आवश्यक होता है। मैन्युअल रूप से JSON पार्स करने और कमांड जांचने के बजाय, एक न्यूनतम संदेश राउटर बनाया जा सकता है। यह दृष्टिकोण SignalR में अंडर-द-हुड उपयोग किया जाता है, लेकिन आप पूर्ण नियंत्रण के लिए इसे स्वयं कार्यान्वित कर सकते हैं।

\n\n
public class WebSocketRouter\n{\n    private readonly Dictionary<string, Func<string, Task>> _routes = new();\n\n    public void On(string action, Func<string, Task> handler)\n    {\n        _routes[action] = handler;\n    }\n\n    public async Task RouteAsync(string rawMessage)\n    {\n        // प्रारूप की अपेक्षा करें                

ब्लॉग

पुस्तक अनुशंसाएँ