2015-01-09 2 views
5

मैं बस अपना सर्वर डिस्कनेक्ट सॉकेट बना रहा हूं जो कुछ सेकंड के बाद कोई डेटा नहीं भेजता है, जैसे 20 सेकंड।कुछ समय के बाद सॉकेट को डिस्कनेक्ट करना कि कोई डेटा रिक्त नहीं हुआ

मुझे आश्चर्य है कि टाइमर के साथ काम करना उसके लिए अच्छा है या सॉकेट लाइब्रेरी में इसके लिए कुछ खास है? प्रत्येक सॉकेट के लिए सर्वर पर टाइमर के साथ काम करना भारी बनाता है।

क्या यह क्लाइंट प्रोग्राम को संभालने में असुरक्षित है? उदाहरण के लिए प्रत्येक क्लाइंट थोड़ी देर के लिए डेटा नहीं भेजने के बाद डिस्कनेक्ट हो जाता है।

+0

एक टाइमर के बारे में जो समय-समय पर सभी सक्रिय ग्राहकों की जांच करता है। डेटा प्राप्त होने पर आपको प्रति ग्राहक अंतिम प्राप्त समय अपडेट करने की आवश्यकता है, और उचित सिंक्रनाइज़ेशन सुनिश्चित करें। –

+0

@AlexFarber शायद। ttl इस के लिए काम करता है? मैं इसके लिए इसका उपयोग कैसे कर सकता हूं? – virtouso

+0

@AlexFarber कृपया मुझे आपको नमूना कोड भेजें। धन्यवाद – virtouso

उत्तर

2

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

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

हटाए गए उत्तर पर आपकी टिप्पणी के लिए, and connection without data send and receive i think it gonna waste your threads आपकी वास्तविक समस्या के करीब अंक - आपके सर्वर के कनेक्शन की मात्रा का कोई संबंध नहीं होना चाहिए कि सर्वर उन कनेक्शनों की सेवा के लिए कितने थ्रेड का उपयोग करता है। तो एकमात्र चीज एक खुला कनेक्शन "अपशिष्ट" मूल रूप से स्मृति का एक छोटा सा है (प्रति कनेक्शन की आपको आवश्यक मेमोरी की मात्रा के आधार पर, साथ ही इसके बफर के साथ सॉकेट लागत) और एक टीसीपी पोर्ट। यह कुछ अनुप्रयोगों में एक मुद्दा हो सकता है, लेकिन यदि आप कभी भी "लोड" के उस स्तर तक पहुंच जाते हैं, तो आप शायद पहले से ही बधाई दे सकते हैं। बंदरगाह सीमा के करीब कहीं भी पहुंचने से पहले आप अन्य संसाधनों से अधिक संभावनाएं निकाल सकते हैं (इस तथ्य के आधार पर धारणा है कि ऐसा लगता है कि आप एक एमएमओ गेम बना रहे हैं)। यदि आप वास्तव में उन लोगों के साथ मुद्दों में भाग लेते हैं, तो आप शायद टीसीपी को छोड़ना चाहते हैं और यूडीपी में सबकुछ फिर से लिखना चाहते हैं (या अधिमानतः, यूडीपी के शीर्ष पर कुछ तैयार समाधान)।

+0

धन्यवाद लुआन। क्या आप एक जीवित प्रणाली में अधिक विस्तृत होंगे जो समय-समय पर संदेश क्लाइंट-> सर्वर भेजता है और इसके विपरीत यदि कोई संचार नहीं हुआ है ... क्या आपका मतलब विशिष्ट अंतराल पर जीवित ग्राहकों के समूह को प्रसारित करना है?यदि आपका यही मतलब है, तो क्या हम इसे ~ 20 के ऑनलाइन उपयोगकर्ताओं के लिए एक अच्छा कामकाज मान सकते हैं? – revo

+1

@revo हाँ, यकीन है। बेशक, एक सर्वर पर 20k ऑनलाइन उपयोगकर्ताओं को पहले से ही कुछ नेटवर्क कॉन्फ़िगरेशन की आवश्यकता है (सबसे महत्वपूर्ण बात यह है कि, सर्वर पर क्षणिक बंदरगाहों की संख्या में वृद्धि), इसलिए आपकी आवश्यकताओं के माध्यम से जाना और यह पता लगाना अच्छा होगा कि टीसीपी एक है या नहीं सब के बाद अच्छा विचार। यूडीपी के शीर्ष पर एक अच्छी नेटवर्किंग लाइब्रेरी (उदाहरण के लिए लिंडग्रेन) आपकी आवश्यकताओं के अनुरूप हो सकती है। – Luaan

0

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

सर्वर अंततः सॉकेट के संसाधनों को जारी करेगा, लेकिन आप जल्द ही संसाधनों को जारी करने के लिए सॉकेट की Connected संपत्ति की जांच कर सकते हैं।

+0

यह एक ऑनलाइन गेम है इसलिए "सभी डेटा" की कोई परिभाषा नहीं है। मैन्युअल रूप से उपयोगकर्ता लॉग आउट होने तक कनेक्शन लगातार जीवित रहता है। – revo

0

जब ग्राहक सर्वर से डिस्कनेक्ट होता है तो सर्वर डिस्कनेक्ट ईवेंट प्राप्त कर सकता है। यह आप भी डिस्कनेक्ट घटना findout तरह

socket.on('disconnect', function() { 
// Disconnect event handling 

}); 

देखने के ग्राहक पक्ष पर .. जिसमें आप सर्वर फिर से कनेक्ट करने की जरूरत है।

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