2009-02-06 16 views
7

मैं वर्तमान में सी # से जावा में एक एपीआई का अनुवाद कर रहा हूं जिसमें नेटवर्क घटक है।नेटवर्क प्रोग्रामिंग: सॉकेट बनाए रखने के लिए या नहीं?

सी # संस्करण इनपुट और आउटपुट स्ट्रीम और सॉकेट को अपने वर्गों की अवधि के लिए खुले रखने के लिए प्रतीत होता है।

क्या यह सही है?

ध्यान में रखते हुए कि एप्लिकेशन आदेश भेज रहा है और उपयोगकर्ता इनपुट के आधार पर घटनाएं प्राप्त कर रहा है, क्या यह प्रत्येक "संदेश" के लिए एक नई सॉकेट स्ट्रीम खोलना अधिक समझदार है?

मैं सर्वर को फेंकने वाले सर्वर को सुनने के लिए सर्वर सॉकेट बनाए रख रहा हूं लेकिन मुझे इतना यकीन नहीं है कि आउटबाउंड कॉम के लिए सॉकेट और आउटपुट स्ट्रीम बनाए रखना इतना अच्छा विचार है।

मैं वास्तव में सॉकेट प्रोग्रामिंग के लिए उपयोग नहीं किया जाता है। जैसा कि कई डेवलपर्स के साथ मैं आमतौर पर एप्लिकेशन लेयर पर काम करता हूं, जब मुझे सॉकेट लेयर पर नेटवर्किंग करने की ज़रूरत होती है, और यह 5 या 6 साल हो गया है क्योंकि मैंने विश्वविद्यालय में यह सामान किया था।

सहायता के लिए चीयर्स। मुझे लगता है कि यह एक निश्चित उत्तर की तुलना में सलाह मांग रहा है।

+0

ओह रुको, मैं देखता हूं ... – Svante

+0

मैं उलझन में हूं कि आप क्या देखते हैं? –

+1

मुझे पता है कि यह सवाल 2.5 साल पुराना है, लेकिन मैं यह कहूंगा (जैसा कि मुझे लगता है कि यह कहने लायक है): कनेक्शन पूल। यही वह है जिसे आप उपयोग करना चाहते हैं (या लागू करें यदि आपके ऐप के पास पहले से निर्मित किसी तक पहुंच नहीं है)। –

उत्तर

14

कनेक्शन खोलने और उन कनेक्शन बनाने की लागत के बीच एक व्यापार बंद है।

कनेक्शन बनाना लागत समय और बैंडविड्थ। आपको 3-तरफा टीसीपी हैंडशेक करना है, एक नया सर्वर थ्रेड लॉन्च करना है, ...

कनेक्शन को खोलना मुख्य रूप से स्मृति और कनेक्शन खर्च करता है। नेटवर्क कनेक्शन ओएस द्वारा सीमित संसाधन हैं। यदि आपके पास बहुत से ग्राहक जुड़े हैं, तो आप उपलब्ध कनेक्शन से बाहर हो सकते हैं। इसकी याददाश्त होगी क्योंकि आपके संबंधित राज्य के साथ प्रत्येक कनेक्शन के लिए एक धागा खुल जाएगा।

सही संतुलित आपके द्वारा अपेक्षित उपयोग के आधार पर अलग होगा। यदि आपके पास बहुत कम समय के लिए कनेक्ट करने वाले बहुत से ग्राहक हैं, तो संभवत: कनेक्शन बंद करने के लिए यह अधिक कुशल होगा। यदि आपके पास लंबे समय तक कनेक्ट करने वाले कुछ ग्राहक हैं, तो आपको शायद कनेक्शन खोलना चाहिए ...

2

यह इस बात पर निर्भर करता है कि आप कितनी बार उपयोगकर्ता को आदेशों में टाइप करने की उम्मीद करते हैं। यदि यह काफी बार होता है, तो आप शायद सॉकेट बंद कर सकते हैं। यदि अक्सर, सॉकेट बार-बार बनाना एक महंगी ऑपरेशन हो सकता है।

अब कहा गया है कि, मशीन संसाधनों के संदर्भ में, कितना महंगा है, क्या यह कम डेटा के लिए सॉकेट कनेक्शन खुला है? आप वास्तव में क्यों सोचते हैं कि "आउटबाउंड कॉम के लिए सॉकेट और आउटपुट स्ट्रीम बनाए रखना इतना अच्छा विचार नहीं है" (भले ही ऐसा करने के लिए सही बात हो)? दूसरी ओर, यह फ़ाइल धाराओं के लिए अलग है यदि आप उम्मीद करते हैं कि अन्य प्रक्रियाएं एक ही फ़ाइल का उपयोग करना चाहती हैं। इस मामले में फ़ाइल स्ट्रीम को बंद करना जल्द ही रास्ता तय करेगा।

आप कितने संभवतः बना सकते हैं कि आप कितने टीसीपी कनेक्शन बना सकते हैं, जो अन्य प्रक्रियाएं आउटबाउंड कनेक्शन का उपयोग करना चाहती हैं? या क्या आप एक समय में अपने सर्वर से कनेक्ट होने वाले बड़ी संख्या में क्लाइंट होने की उम्मीद करते हैं?

+0

पोर्ट नंबर से बाहर होने से पहले आप कनेक्शन से बाहर चले जाएंगे। – paxdiablo

+0

एक सर्वर एक ग्राहक तो कनेक्शन से बाहर नहीं जा रहा है। पोर्ट निर्दिष्ट है क्योंकि एपीआई एक टीसीपी आधारित प्रोटोकॉल के चारों ओर एक रैपर है। –

+0

मेरा बुरा, मुझे लगता है कि मैं अपने नेटवर्क प्रोग्रामिंग को भी भूल गया हूं – Mystic

3

यदि आपको क्लाइंट और सर्वर पर केवल एक सॉकेट मिला है, तो आपको इसे लंबे समय तक खोलना चाहिए यथासंभव।

3

यदि आपका एप्लिकेशन और जिस सर्वर से यह बात करता है, वह निकट है, नेटवर्क के अनुसार, कनेक्शन को बंद करने के लिए यह समझदार हो सकता है, लेकिन यदि वे दूर हैं, तो नेटवर्क-वार, आप शायद सॉकेट के लिए लाइव होने से बेहतर हैं अवधी।

गिलाउम ने 3-तरफा हैंडशेक का उल्लेख किया और इसका मूल अर्थ यह है कि सॉकेट खोलने से कम से कम 3 गुना कम पैकेट ट्रांजिट समय लगेगा। इसका अनुमान "अर्ध पिंग राउंड-ट्रिप" द्वारा किया जा सकता है और लंबी दूरी के लिए आसानी से 60-100 एमएस तक पहुंच सकता है। यदि आप अतिरिक्त 300 एमएस प्रतीक्षा करते हैं, तो प्रत्येक कमांड के लिए, यह उपयोगकर्ता अनुभव को प्रभावित करेगा?

व्यक्तिगत रूप से, मैं सॉकेट खोलता हूं, यह आसान है और "कुछ भेजने की आवश्यकता" के हर उदाहरण के लिए समय नहीं लगता है, सापेक्ष लागत छोटी है (एक फ़ाइल डिस्क्रिप्टर, डेटा संरचनाओं के लिए कुछ स्मृति उपयोगकर्ता-स्थान में और कर्नेल में कुछ अतिरिक्त संग्रहण)।

0

आप डेटाग्राम सॉकेट और डेटाग्राम पैकेट भी देख सकते हैं। लाभ कम ओवर-हेड है, नुकसान ओवर-हेड है जो नियमित सॉकेट प्रदान करता है।

+0

मेरे पास प्रोटोकॉल बदलने का विकल्प नहीं है, मैं एक विक्रेता एप्लिकेशन से कनेक्ट कर रहा हूं। –

+0

और देव द्वारा लागू की जाने वाली विश्वसनीयता की आवश्यकता है? नहीं साहब! – hexafraction

0

मेरा सुझाव है कि आप ActiveMQ या Netty जैसे मौजूदा संदेश समाधान का उपयोग करने पर विचार करें। यह मैसेजिंग के साथ आपको मिलने वाले कई मुद्दों को संभालेगा।

0

मैं थोड़ी देर से आ रहा हूं, लेकिन मैंने किसी को यह सुझाव नहीं दिया।

मुझे लगता है कि आपके कनेक्शन को पूल करने पर विचार करना बुद्धिमान होगा (यदि सॉकेट या टीसीपी कोई फर्क नहीं पड़ता), तो जोड़े के कनेक्शन को खोलने में सक्षम होने और प्रदर्शन के मामले में तेज़ी से उनका उपयोग करने के लिए इष्टतम होगा।

वास्तव में, रोज़लिन संकलक इस तकनीक का उपयोग कई स्थानों पर बड़े पैमाने पर करते हैं। https://github.com/dotnet/roslyn/search?l=C%23&q=pooled&type=&utf8=%E2%9C%93

संबंधित मुद्दे