2013-06-27 4 views
5

मेरे पास एक जावा प्रोग्राम है जो सर्वर स्वीकार करने वाले कनेक्शन के रूप में चलता है, और मैं एंड्रॉइड क्लाइंट को इससे कनेक्ट करता हूं। ग्राहक लंबे समय से अपने सॉकेट में जुड़े हुए हैं।जावा सॉकेट (जावा सर्वर से एंड्रॉइड)

1) 3 जीबी रैम के साथ औसत मशीन पर मैं कितने क्लाइंट समवर्ती रूप से सर्वर (अभ्यास में - अब बंदरगाहों की संख्या के बारे में बात नहीं कर सकता) कर सकता हूं?

2) यदि फोन कनेक्शन के लिए 3 जी का उपयोग करता है, तो क्या यह संभव है कि सॉकेट टूट गया हो? यदि ऐसा है, तो मैं इसे कैसे पुनर्प्राप्त करूं या इसे क्लाइंट पक्ष से किया जाना चाहिए? या यह स्वचालित रूप से किया जाता है? क्या यह अक्सर होता है?

+0

शायद आपको जावा एनओ या नेटटी जैसे प्रोजेक्ट को देखना चाहिए यदि आप बिंदु 1 में अधिक रूचि रखते हैं। – Abe

उत्तर

3

1) ग्राहकों के लिए सर्वर क्या करता है इस पर निर्भर करता है। अगर सर्वर सिर्फ कनेक्शन स्वीकार करता है और कुछ और नहीं करता है तो यह शायद हजारों ग्राहकों की सेवा कर सकता है। अगर सर्वर ऐसा कुछ करता है जिसके लिए सीपीयू, मेमोरी या आई/ओ की आवश्यकता होती है तो यह कम ग्राहकों की सेवा कर सकती है।

2) हां, वायर्ड नेटवर्क पर भी, टीसीपी कनेक्शन तोड़ सकते हैं। यदि लिंक वापस आता है तो सॉकेट कनेक्शन टूटा नहीं जाता है; टीसीपी खोए गए डेटा को पुनः प्रेषण संभालती है। समस्या यह है कि अगर लिंक वापस नहीं आ जाता है तो क्या होता है? यदि आप SO_KEEPALIVE का उपयोग करते हैं तो कनेक्शन अंततः बंद हो जाएगा, लेकिन डिफ़ॉल्ट टाइमआउट इस समस्या के लिए संवेदनशील 2 घंटे के अनुप्रयोगों के बाद से अपने स्वयं के टाइमआउट तंत्र को लागू करता है।

+0

नंबर 2 के रूप में, क्या इसका मतलब यह है कि सॉकेट ब्रेकडाउन होने पर सॉकेट हुड के नीचे ठीक हो जाएगा? और मुद्दा यह पता लगाने के लिए है कि क्या सॉकेट बहुत लंबे समय तक टूट गया है? (हाँ, सॉकेट टीसीपी है) –

+1

एक स्थायी कनेक्शन एक भ्रम है; टीसीपी पैकेट भेजकर काम करता है। एक टूटी हुई लिंक का मतलब है कि पैकेट गायब हो जाते हैं। यदि लिंक वापस आता है, तो पैकेट फिर से पहुंचने लगते हैं। आप यहां पढ़ सकते हैं कि टीसीपी कैसे पैकेट नुकसान से संबंधित है: https://en.wikipedia.org/wiki/Transmission_Control_Protocol – Joni

+1

@ArtemMoskalev सॉकेट ठीक नहीं होगा। टीसीपी इंटरमीटेड कनेक्टिविटी के मुद्दों और पैकेट नुकसान को सहन करेगा - और यदि आप कोई संचार नहीं करते हैं, तो यह महीनों के लिए कनेक्टिविटी हानि सहन कर सकता है। हालांकि, बहुत सारे, ऐसे मामले हैं जहां यह ठीक नहीं होता है - इसलिए आपको इसे किसी भी तरह से संभालना होगा (उदा। एनएटी/फ़ायरवॉल आपके कनेक्शन को समाप्त कर रहा है, नेटवर्क असफलताएं जो टीसीपी को समय निकालती हैं, और कई अन्य स्थितियों)। आपको इसे क्लाइंट पर पहचानना है ताकि यह फिर से कनेक्ट हो सके, और सर्वर पर ताकि यह पुरानी/मृत सॉकेट से छुटकारा पा सके। – nos

1

1) कितने ग्राहकों मैं सर्वर समवर्ती (व्यवहार में हो सकता है - im 3 जीबी रैम के साथ एक औसत मशीन पर अब) बंदरगाहों की संख्या के बारे में बात नहीं कर रहा?

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

2) यदि फोन कनेक्शन के लिए 3 जी का उपयोग करता है, तो क्या यह संभव है कि सॉकेट टूटा हुआ हो? यदि ऐसा है, तो मैं इसे कैसे पुनर्प्राप्त करूं या इसे क्लाइंट साइड से किया जाना चाहिए? या यह स्वचालित रूप से किया जाता है? क्या यह अक्सर होता है?

सॉकेट को तोड़ने के कई कारण हो सकते हैं जिनमें सर्वर क्रैश, नेटवर्क विफलता, सॉकेट टाइमआउट या कई अन्य शामिल हैं। यदि सॉकेट टूटा हुआ है तो पुनर्प्राप्त करने का कोई तरीका नहीं है। यह टीसीपी द्वारा स्वचालित रूप से नहीं किया जा सकता है। आपको उस मामले में सर्वर से फिर से कनेक्ट करना होगा। Socket#getInputStream()

के दैवज्ञ आधिकारिक दस्तावेज में विनिर्दिष्ट असामान्य परिस्थितियों में अंतर्निहित कनेक्शन दूरस्थ होस्ट या नेटवर्क सॉफ्टवेयर (उदाहरण के लिए TCP कनेक्शन के मामले में एक कनेक्शन रीसेट) द्वारा तोड़ा जा सकता है। एक टूटी हुई कनेक्शन नेटवर्क सॉफ्टवेयर द्वारा पता लगाया जाता है निम्नलिखित लौटे इनपुट स्ट्रीम पर लागू होता है: -

  • नेटवर्क सॉफ्टवेयर बाइट्स कि सॉकेट द्वारा बफ़र कर रहे हैं त्यागने सकता है। नेटवर्क सॉफ़्टवेयर द्वारा छोड़े गए बाइट्स पढ़कर पढ़कर पढ़ सकते हैं।
  • यदि सॉकेट पर कोई बाइट buffered नहीं है, या सभी buffered बाइट्स पढ़कर उपभोग किया गया है, तो पढ़ने के लिए सभी बाद की कॉल एक IOException फेंक देंगे।
  • कोई बाइट्स सॉकेट पर बफ़र देखते हैं, और सॉकेट का उपयोग कर पास, फिर उपलब्ध 0.
0

वापस आ जाएगी कुछ अधिक जानकारी की आवश्यकता बंद कर दिया नहीं किया गया है, उदाहरण के लिए, जब ग्राहकों को क्या करना कनेक्ट वे करते हैं, इसके विपरीत सर्वर से डेटा भेजने के लिए प्रतीक्षा करें? क्या वे एक संवाद रखते हैं o बिना किसी संवाद के दूसरी तरफ से प्रेषित डेटा की प्रतीक्षा करें?

मुझे लगता है कि जब कोई क्लाइंट कनेक्ट करता है तो आप उस क्लाइंट को प्रेषित करने के लिए थ्रेड शुरू करते हैं, उस थ्रेड में आप टाइमआउट डाल सकते हैं, 15-30 मिनट की तरह कुछ, अगर उस समय कोई डेटा प्राप्त नहीं होता है तो आप सॉकेट को बंद कर देते हैं और टर्मिनेट करते हैं सूत्र। साथ ही, क्या एक ही आईपी 1 से अधिक कनेक्शन स्थापित कर सकता है? यदि ऐसा नहीं है, तो आपको ट्रैक रखने की आवश्यकता है कि कौन से कनेक्ट है और आईपी पहले से ही सूची में होने पर अपने पूर्व सत्र को समाप्त कर देगा।

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

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