2013-01-31 22 views
23

मुझे एक काफी सरल टीसीपी/आईपी सर्वर डिजाइन करने के लिए काम सौंपा गया है जिसे एकाधिक ग्राहकों से कनेक्शन स्वीकार करना होगा। इसे सी # में लिखा जाना चाहिए, और मैं .NET 4.5 का उपयोग कर रहा हूं। उस ने कहा, मुझे यकीन नहीं है कि .NET 4.5 में टीसीपी/आईपी सर्वर/क्लाइंट स्केलेबिलिटी के लिए वर्तमान "कला की स्थिति" क्या है।एसिंक/प्रतीक्षा पैटर्न के साथ सी # 5 में एक उच्च स्केलेबल टीसीपी/आईपी सर्वर लिखना?

मैंने यह पोस्ट देखा था: How to write a scalable Tcp/Ip based server। लेकिन यह .NET 2.0 और 3.5 से संबंधित है और एसिंक/प्रतीक्षा पैटर्न का कोई उल्लेख नहीं करता है।

मैं सर्वर को "पुराना तरीका" लिखने में सक्षम हूं ... लेकिन मैं जानना चाहता हूं कि "नया तरीका" क्या है।

  • सी # में स्केलेबल सर्वर बनाने के लिए सॉकेट, टीसीपी क्लाइंट या टीसीपीलिस्टर पर नई Async विधियों का उपयोग करने का सबसे अच्छा तरीका क्या है?
  • नई Async विधियों I/O प्राप्ति बंदरगाहों का लाभ उठाएं?
  • अपने स्वयं के सॉकेट श्रोता को अधिक कुशल बना रहा है, या टीसीपी लिस्टनर/टीसीपी क्लाइंट कक्षाएं अब बहुत अच्छी हैं?

संपादित करें: अतिरिक्त प्रश्न।

+3

कोई सी # 4.5 नहीं है :) यह .NET 4.5, सी # 5 –

+0

Sigh .. वह बेवकूफ है। मुझे सही करने के लिए धन्यवाद। –

+0

http://signalr.net/ – Richard

उत्तर

10

सी # में स्केलेबल सर्वर बनाने के लिए सॉकेट, टीसीपी क्लाइंट या टीसीपी लिस्टनर पर नई Async विधियों का उपयोग करने का सबसे अच्छा तरीका क्या है?

Socket पर कोई नया async विधियां नहीं हैं; पर *Async नामक विधियां स्मृति उपयोग को कम करने के लिए एपीआई का एक विशेष सेट हैं। TcpClient और TcpListener को कुछ नया async विधियां मिलीं।

यदि आप सबसे अच्छी स्केलेबिलिटी चाहते हैं, तो शायद आप Stephen Toub's custom awaiters for Socket का उपयोग कर सबसे अच्छे हैं। यदि आप कोड को सबसे आसान बनाना चाहते हैं, तो आप शायद TcpClient और TcpListener का उपयोग कर बेहतर बंद कर सकते हैं।

नई Async विधियों का लाभ I/O पूरा बंदरगाहों का लाभ उठाएं?

हां, बस बीसीएल में अन्य एसिंक्रोनस एपीआई की तरह। AFAIK, Stream कक्षा एकमात्र ऐसा है जो संभावित रूप से आईओसीपी का उपयोग नहीं कर सकता है; अन्य सभी *Begin/*End/*Async विधियां आईओसीपी का उपयोग करती हैं।

अपने स्वयं के सॉकेट श्रोता को अधिक कुशल बना रहा है, या टीसीपीलिस्टर/टीसीपी क्लाइंट कक्षाएं अब बहुत अच्छी हैं?

कक्षाएं उतनी अच्छी हैं जितनी वे हैं। स्टीफन टब के पास blog post है जो स्मृति उपयोग के मामले में थोड़ा अधिक कुशल है।

+0

प्रश्न से संबंधित नहीं, आईओ प्राप्ति बंदरगाह क्या है? मुझे खेद है, वीबी पृष्ठभूमि मुझे इस पर नहीं आती है। धन्यवाद। – shahkalpesh

+0

@StaurtDunkeld उपरोक्त आलेख को लिंक किया है। मैंने इसे देखा, और मुझे लगता है कि मैंने यह नहीं देखा कि यह एक अधिक कुशल श्रोता/ग्राहक बनाने का प्रयास था। मैं समझने की कोशिश कर रहा हूं कि यह और अधिक मेमोरी कुशल बनाता है। क्या आपको एक टीसीपी क्लाइंट को तुरंत चालू करने और कनेक्शन को प्रबंधित करने के लिए इसे रखने की आवश्यकता नहीं है? –

+1

@ शाहकालपेश: [एसिंक्रोनस I/O] को नियंत्रित करने का एक प्रभावी तरीका (http://msdn.microsoft.com/en-us/library/aa365198%28v=VS.85%29.aspx)। .NET वर्तमान में थ्रेड पूल में बंधे हुए एक आईओसीपी प्रति ऐप डोमेन का उपयोग करता है। –

0

.net4.5 के साथ आप tcp सर्वर बनाने के लिए async/await कीवर्ड का उपयोग कर सकते हैं। यहां नमूना कोड है। async await tcp server

यह 10K से अधिक कनेक्शन स्वीकार कर सकता है। tcp server