के साथ सहायता मैं एक "एप्लिकेशन सिस्टम" पर काम कर रहा हूं, जहां मुझे सर्वर एप्लिकेशन बनाने की भी आवश्यकता है। मैं सी # (.NET 4.0) में काम कर रहा हूं। सर्वर मुख्य रूप से विभिन्न पीओएस अनुप्रयोगों/ग्राहकों से डेटा एकत्र करेगा (जो लगभग 50-100 होना चाहिए, लेकिन सर्वर 200-300 ग्राहकों को संभालने में सक्षम होना चाहिए)। एक ग्राहक से एक सर्वर को लगभग 1KB दिन में लगभग 100x बार प्राप्त होगा। सर्वर को मुख्य रूप से डेटा स्वीकार करने, इसे डिक्रिप्ट करने और डिस्क पर संग्रहीत करने की आवश्यकता होती है। ग्राहकों को नई कॉन्फ़िगरेशन भेजने के लिए इसे विशिष्ट निर्देशिका में परिवर्तनों की भी जांच करनी चाहिए, जो अक्सर नहीं होना चाहिए।ईवेंट संचालित टीसीपी सर्वर
मैं सी # और सर्वर प्रोग्रामिंग के लिए काफी नया हूं इसलिए कृपया मेरे साथ भालू। मैंने थ्रेडपूलिंग और एसिंक तरीकों का उपयोग करने के बारे में सोचा था (उसमें "सी # संक्षेप में" पुस्तक में इसका उपयोग करके एक अच्छा उदाहरण है। लेकिन मैं काफी समय के लिए सबसे अच्छा समाधान की तलाश में बिताता हूं और मुझे यह मिला। लेकिन मल्टीथ्रेडिंग मेरे मामले में लाभ की तुलना में अधिक समस्याएं लाती है। इस प्रकार मैंने सर्वर को भी संचालित करने के बारे में सोचा। "एक एकल प्रक्रिया, कॉलबैक पर प्रत्येक घटना (स्वीकृत कनेक्शन, पढ़ने के लिए उपलब्ध डेटा, क्लाइंट को लिख सकते हैं ...) को संभालती है।" "what is event driven web server" से। मुझे लगता है कि मेरी समस्या का सबसे अच्छा समाधान है।
लेकिन मुझे यह नहीं पता कि इसे कैसे कोड किया जाए, मुझे ईवेंट संचालित सर्वर के बारे में कोई उदाहरण नहीं मिला। जहां तक मैं इसे समझता हूं, मुझे एक थ्रेड (जीयूआई के लिए + 1) बनाना चाहिए, फिर एक टीसीपी श्रोता बनाएं और फिर किसी भी तरह से ईवेंट बनाएं ताकि जब टीसीपी श्रोता ग्राहक को स्वीकार कर सके तो ईवेंट आग लग जाएगा और सर्वर को जगाएगा, जब डेटा ग्राहकों से पढ़ने के लिए उपलब्ध होगा यह सर्वर को जगाएगा।
कृपया इसे कोड करने में मेरी सहायता करें, मैं पूरी तरह से खो गया हूं। मुझे पता है कि मैं
while(true)
{
check if client wants to connect
accept client and add it to client list
iterate through client list and check if anyone is sending data ...
accept data and store it
...
}
का उपयोग करके यह कैसे कर सकता हूं लेकिन यह घटना संचालित नहीं है और सीपीयू बर्बाद कर रही है। सर्वर बहुत सक्रिय नहीं होगा, इसलिए मैं इसे यथासंभव कुशल बनाना चाहता हूं।
कुछ उदाहरण वास्तव में मदद करेंगे।
आपके समय और उत्तरों के लिए धन्यवाद।
पेज। क्या मैं सभी ग्राहकों के लिए सिर्फ एक बंदरगाह का उपयोग कर सकता हूं?
संपादित करें: स्पष्टीकरण के लिए, मैं एक ईवेंट संचालित सर्वर को कोड करना चाहता हूं, लेकिन मुझे नहीं पता कि कैसे, इस प्रकार मैंने केवल जो कुछ मुझे पता है (क्लाइंट मतदान) का उदाहरण दिया।
भयानक उदाहरण के साथ करना बहुत आसान है। यह रिमोट एंड (0 बाइट्स पढ़ने) से अपवाद या डिस्कनेक्ट को संभाल नहीं करता है। यह किसी एसिंक को किसी ईवेंट के साथ सिंक करने के लिए स्वीकार करता है, क्यों न केवल 'AcceptTcpClient' का उपयोग करें। एसिंक ऑपरेशंस में जादू संदर्भों का उपयोग न करें (आपके मामले में ऑब्जेक्ट सरणी में); – jgauffin