2012-06-07 5 views
6

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

मैं कर रहा हूँ मेरा एक पुरानी प्रणाली है जो ScktComps से पुराने जमाने TServerSocket और TClientSocket घटकों का उपयोग करता है और फिर से निर्माण इंडी TIdTCPServer और TIdTCPClient साथ इसे फिर से कर रही है। पुरानी प्रणाली में वास्तव में प्रत्येक छोर पर 3 पूरी तरह से अलग सर्वर/क्लाइंट सॉकेट होते हैं, प्रत्येक सॉकेट एक विशिष्ट उद्देश्य की सेवा करता है, और साथ मिलकर काम करता है - जैसे कि एफ़टीपी बाइनरी डेटा के लिए एक सॉकेट का उपयोग करता है और कमांड के लिए अन्य सॉकेट का उपयोग करता है।

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

उत्तर

12

हां, आप एक समय में एकाधिक बंदरगाहों को प्रबंधित करने के लिए एक TIdTCPServer का उपयोग कर सकते हैं। क्लाइंट साइड पर, आपको अभी भी विभिन्न बंदरगाहों से कनेक्ट करने के लिए 3 विशिष्ट क्लाइंट घटक की आवश्यकता है।

TIdTCPServer.Bindings संग्रह में 3 प्रविष्टियां बनाएं, प्रत्येक स्थानीय आईपी/पोर्ट के लिए एक जिसे आप सुनना चाहते हैं, जहां TIdSocketHandle.Port संपत्ति TServerSocket.Port संपत्ति का समतुल्य होगा। TServerSocket मूल रूप से किसी विशिष्ट आईपी को बाध्यकारी का समर्थन नहीं करता है (हालांकि इसे कुछ मैन्युअल कार्य के साथ किया जा सकता है), लेकिन उस उद्देश्य के लिए TIdSocketHandle.IP प्रॉपर्टी का उपयोग किया जाता है, जहां रिक्त स्ट्रिंग INADDR_ANY पर समतुल्य होती है।

TIdCPServer.OnConnect, TIdCPServer.OnDisconnect में, और TIdCPServer.OnExecute घटनाओं, आप को अलग करने के जो बंधन बुला सॉकेट से जुड़ा है TIdContext.Binding.IP और TIdContext.Binding.Port गुणों का उपयोग कर सकते हैं।

इसका एक सामान्य उपयोग एसएसएल और गैर-एसएसएल क्लाइंट को विभिन्न बंदरगाहों पर समर्थन देना है, जैसे पीओपी 3 और एसएमटीपी जैसे प्रोटोकॉल के लिए जो अलग-अलग बंदरगाहों पर निहित और स्पष्ट एसएसएल/टीएलएस का समर्थन करते हैं। TIdHTTPServer यह एक सर्वर पर HTTP और HTTPS यूआरएल का समर्थन करने के लिए करता है (आप TIdHTTPServer.OnQuerySSLPort का उपयोग कर सकते हैं ताकि कौन से बंदरगाह एसएसएल/टीएलएस बनाम बनाते हैं)।

उदाहरण के लिए:

procedure TForm1.StartButtonCick(Sender: TObject); 
begin 
    IdTCPServer1.Active := False; 
    IdTCPServer1.Bindings.Clear; 

    with IdTCPServer1.Bindings.Add do 
    begin 
    IP := ...; 
    Port := 2000; 
    end; 

    with IdTCPServer1.Bindings.Add do 
    begin 
    IP := ...; 
    Port := 2001; 
    end; 

    with IdTCPServer1.Bindings.Add do 
    begin 
    IP := ...; 
    Port := 2002; 
    end; 

    IdTCPServer1.Active := True; 
end; 

procedure TForm1.IdTCPServer1Execute(AContext: TIdContext); 
begin 
    case AContext.Binding.Port of 
    2000: begin 
     // do something... 
    end; 
    2001: begin 
     // do something else... 
    end; 
    2002: begin 
     // do yet something else ... 
    end; 
    end; 
end; 
+0

बहुत बढ़िया, बस सोच प्रत्येक बंदरगाह उसी संदर्भ सूत्र में अपने स्वयं के धागे या संभवत: सभी 3 उपयोग कर रहा है? –

+1

'बाइंडिंग्स' संग्रह में प्रत्येक प्रविष्टि अपने स्वयं के धागे में अपने संबंधित बंदरगाह पर इनबाउंड कनेक्शन स्वीकार करती है। प्रत्येक स्वीकृत ग्राहक कनेक्शन तब भी अपने धागे में चलता है। इसलिए यदि आपके पास 3 'बाइंडिंग्स प्रविष्टियां और 3 कनेक्टेड क्लाइंट हैं, तो यह 6 थ्रेड चल रहा है। –

+0

बिल्कुल सही, यह वही है जो मैं चाहता था। –

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