2011-12-01 17 views
5

मैं जावा में एक मल्टीथ्रेड प्रोग्राम लिखने की कोशिश कर रहा हूं जहां एक सर्वर क्लाइंट से कनेक्शन के लिए सुनता है और प्रत्येक क्लाइंट को कम करने के लिए थ्रेड को स्पैन करता है। मेरे पास है:जावा में मल्टीथ्रेड सर्वर प्रोग्राम

while(true) 
    { 
     Socket s = server.accept();  
     ClientHandler ch = new ClientHandler(s); 
     Thread t = new Thread(ch); 
     t.start(); 
    } 

मेरे सवाल यह है: जब भी यह

Socket s = server.accept(); 

में एक कनेक्शन स्वीकार करता है और कोड के निम्नलिखित लाइनों को क्रियान्वित धागा आदि बनाने के लिए शुरू होता है, क्या से कनेक्शन के लिए एक अनुरोध करने के लिए होता उस समय के दौरान एक ग्राहक। क्या यह किसी भी तरह से कतारबद्ध है और इसे while(true) के अगले लूप में सेवा दी जाएगी या इसे अस्वीकार कर दिया जाएगा?

धन्यवाद, निकोस

उत्तर

4

accept() रिटर्न के बाद टीसीपी हाथ मिलाना पूरा हो गया है और आप एक जुड़ा ग्राहक सॉकेट (s अपने कोड में) है। accept() पर अगली कॉल तक ओएस कतार कनेक्शन अनुरोध लंबित है।

उदाहरण के लिए आप this one जैसे कुछ ट्यूटोरियल देखना चाहेंगे।

0

जैसा कि पहले से ही इसका उत्तर दिया गया था: हाँ यह कतारबद्ध है और इसे अस्वीकार नहीं किया गया है।

मुझे लगता है कि इस सवाल का पढ़ने किसी को भी पहले पता होना चाहिए कि जब आप एक सॉकेट का दृष्टांत:

server = new ServerSocket(mPort, mNusers); 

जावा पहले से ही एक network socket लागू कर रहा है; जिसने स्पष्ट रूप से परिभाषित व्यवहार किया है। हालांकि सीमा सेट तक पहुंचने के बाद कनेक्शन खारिज कर दिया जाएगा।

इसके अलावा, कोड सवाल में तैनात कई कनेक्शन स्वीकार लेकिन पिछले के लिए संदर्भ खो देता है। यह एक "duh" हो सकता है लेकिन अगर कोई प्रतिलिपि बना रहा है, तो आपको सभी बनाए गए सॉकेट या हैंडलर को स्टोर करने के लिए कुछ करना चाहिए। शायद:

ClientHandler[] ch = new ClientHandler[mNusers]; 
int chIndex = 0; 
while(true) 
    { 
     Socket s = server.accept();  
     ch[chIndex] = new ClientHandler(s); 
     Thread t = new Thread(ch); 
     t.start(); 
     chIndex++; 
    } 

एक सरणी सबसे अच्छा विकल्प नहीं हो सकता है, लेकिन मैं कहना है कि सॉकेट के साथ आपको पता होना चाहिए कि क्या कनेक्शन की सीमा आप आवंटित करेगा

1

मैं जावा में a tiny http server लिखा है, जो आप कर सकते हैं है चाहता हूँ जिथब पर खोजें। सॉकेट और मल्टीथ्रेडिंग के असली दुनिया के उपयोग पर नज़र डालने के लिए यह एक अच्छा उदाहरण हो सकता है।

0

ओह :)

कॉल और एक सिस्टम-वाइड सीमा प्रति एक वहाँ एक तथाकथित SYN-पंक्ति, जो अभी तक नहीं स्थापित कनेक्शन (के अनुरोध राशि का समय लगता है वहाँ है - यकीन है कि अगर नहीं इसकी भी उपयोगकर्ता सीमित)।

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

तो

क) में वृद्धि है कि धीरे धीरे को स्वीकार करने के लिए जब आप कर रहे हैं (सर्वर।स्वीकार()) कनेक्शन

ख) एक ThreadPool का उपयोग करके

बी .1 तेजी से कनेक्शन स्वीकार) (खुश ओएस के संदर्भ-स्विच)

बी .2) के लिए समस्या बढ़ रहा हो NIO का उपयोग करें और है कि एक धागे के भीतर सॉकेट राज्यों को संभालने के लिए/सीपीयू की क्षमता के साथ

मज़ा

(जब तक आंतरिक डेटा throughput नेटवर्क में एक से बेहतर है, यह अधिक performant विकल्प है)
संबंधित मुद्दे