2012-09-28 16 views
5

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

आप सॉकेट पर HttpListener को कब पसंद करते हैं। प्रत्येक के क्या फायदे हैं?

+0

पार्सिंग/HTTP शीर्ष लेख में संशोधन करना, सामग्री पढ़ने, chunked हस्तांतरण से निपटने आदि HttpListener साथ बहुत सरल कर रहे हैं। –

+0

आप HttpRequests को किस प्रकार के संशोधन करने जा रहे हैं? –

+0

मैं होस्टहेडर बदल रहा हूं, कुछ अनुरोधों को पुनर्निर्देशित कर रहा हूं आदि – NewUnhandledException

उत्तर

13
  • HttpListener
    • के लाभ अन्य प्रक्रियाओं http.sys उपयोग करने के साथ पोर्ट शेयरिंग (HttpListener या IIS का उपयोग उन सहित, जब तक कि उपसर्गों अद्वितीय हैं)
    • लिए http.sys मैं का उपयोग करता है की अनुमति देता है/हे आपके लिए पूरा बंदरगाह; यह TcpListener
    • का उपयोग कर HttpListener HTTP हेडर को पार्स करता है बिना अपने आप को कि सेट करने के लिए बहुत मुश्किल है और प्रतिक्रिया
    • आप वर्गों है कि बहुत ज्यादा ASP.Net में उन है कि हेडर बेनकाब की तरह हैं का एक सेट देता है के लिए HTTP हेडर बनाता है, स्थानीय होस्ट ग्राहक HTTP के माध्यम से बड़े पेलोड भेजने के उन पेलोड के कई अतिरिक्त प्रतियां की तुलना किए जाने के लिए कारण बनता है TcpListener या मोनो HttpListen - कुकीज़, आदि
  • HttpListener
    • प्रमुख का नुकसान विंडोज़ पर एर बड़ी सीपीयू की आवश्यकता होने पर बड़ी मशीन (उदाहरण के लिए 5 एमबी से अधिक) पोस्ट मशीनों को उसी मशीन पर प्रक्रियाओं के बीच से बचा जाना चाहिए। इसके बजाय स्मृति मैप की गई फ़ाइलों (अनिवार्य रूप से साझा स्मृति) का उपयोग करने पर विचार करें। क्लाइंट और सर्वर विभिन्न मशीनों पर होने पर ये अतिरिक्त प्रतियां कोई समस्या नहीं होती हैं।
    • स्पष्ट नियंत्रण की अनुमति नहीं देता है कि टीसीपी सॉकेट कितनी देर तक खुला रहता है; http.sys आपके लिए यह प्रबंधित करता है (यह आमतौर पर एक बड़ा नुकसान नहीं होता है, लेकिन यह केवल कुछ पता होना चाहिए)
    • हेडर/कुकी कक्षाओं में कोई भी बग आपको काट देगा; जैसे कि कई कुकीज़ सेट करने पर समस्या एचटीपी लिस्टनर को एक ही सेट-कुकी हेडर को कई कुकीज के साथ वापस करने का कारण बनती है, जो आईई संभाल लेगा लेकिन क्रोम पूरी तरह से अनदेखा कर देगा (आपको कुकीज़ को हाथ से रोल करना होगा और अपना स्वयं का सेट- काम के आसपास कुकी शीर्ष लेख को यह)
  • लाभ TcpListener
    • की HttpListener की तरह, इस
    • आप एक कनेक्शन के लिए एक बार कुछ करने के लिए चाहते हैं (आप के लिए मैं/हे समापन बंदरगाहों को लागू करता है की जांच की तरह औथ), जब आप सॉकेट खोले जाते हैं तो आप इसे कर सकते हैं; हालांकि, आप अन्य कारणों से (प्रॉक्सी और लोड बैलेंसर्स एक ही सॉकेट से अधिक से अधिक उपयोगकर्ताओं से अनुरोध भेजने जा सकता है) TcpListener बनाम की
  • नुकसान के लिए इस पर निर्भर नहीं चाहते हो सकता हैHttpListener
    • आप एक HTTP हेडर पार्सर की आपूर्ति करने के लिए है
    • आप मान्य करने के लिए है कि HTTP अनुरोध मान्य
  • अपनी खुद की
    • कोई नहीं पर रोलिंग के लाभ यह 100% है कि मैं अपनी खुद कीपर TcpListener
  • रोलिंग इस 100% का नुकसान उपयोग की तुलना के बारे में सोच सकते हैं,
    • आप अपने नेटवर्क परत कोड में बहुत सारे अनावश्यक/गलत ताले पेश करेंगे, जो एक समय में एक ही अनुरोध के प्रदर्शन की जांच करते समय कोई समस्या नहीं पैदा करेगा, लेकिन प्रदर्शन के तहत प्रदर्शन को वास्तव में भुगतना होगा। इन्हें ढूंढने और उन्हें ठीक करने में कुछ समय लगेगा।
    • हमने इसे एक परियोजना पर अपने आप पर रोल किया और हमने एचटीपी लिस्टनर के रूप में कोडिंग के कई महीनों के साथ एक ही प्रदर्शन किया और परिणामस्वरूप कोड बेस जो अनजान था। हमने इसे बाहर निकाल दिया और सभी कस्टम कोड को एचटीपी लिस्टनर के साथ किसी भी नकारात्मक प्रदर्शन प्रभाव के बिना और बनाए रखने के लिए काफी कम कोड के साथ बदल दिया।

नवंबर वर्ष 2016 अद्यतन: HttpListener बहुत अच्छी तरह से काम करता है जब दूरदराज मशीनों से ट्रैफ़िक मिल रहा। हालांकि, जब ग्राहक स्थानीयहोस्ट पर होता है तो बड़े पेलोड के लिए एचटीपी लिस्टनर खराब विकल्प होता है। इसका कारण आंशिक रूप से है क्योंकि HttpListener http.sys का उपयोग करता है, जो एक कर्नेल मॉड्यूल है, और स्पष्ट रूप से कार्यान्वयन शरीर डेटा के कई अतिरिक्त प्रतियों का कारण बनता है। उदाहरण के लिए, सी # में एक सरणी से दूसरे सरणी में 100 एमबी की प्रतिलिपि बनाना 35 एमएस लेता है जबकि स्थानीय क्लाइंट से 100 एमबी पोस्ट करने के लिए एचटीपी लिस्टनर 350 एमएस (हाँ, 10x लंबा) लेता है। इस मामले में मोनो के एचटीपी लिस्टर को स्विच करने से समय 250 एमएस तक गिर जाता है। सॉकेट क्लाइंट के साथ टीसीपीलिस्टर का उपयोग 180 एमएस लेता है। MemoryMappedFiles का उपयोग कर सर्कुलर बफर के लिए सॉकेट के उपयोग को स्वैप करना 55 एमएस लेता है। इस प्रकार स्थानीय मशीन से एक्सेस होने पर एचटीपी लिस्टनर बड़े पेलोड के लिए इतना अच्छा काम नहीं करता है। नोट: यदि आप इस परीक्षण को पुन: पेश करने का प्रयास करते हैं तो आपको समय अंतर को मापने के लिए सावधानी बरतनी होगी। स्टर्न डेटा भेजना शुरू कर देता है और जब सरणी प्राप्त करने की प्रक्रिया में आबादी को पूरा कर रही है क्योंकि कुछ भेजें/लिखने के तरीके लगभग किसी भी डेटा को भेजने के बिना लगभग तुरंत लौटते हैं (जिसे आप शून्यों की एक सरणी भेजकर साबित कर सकते हैं और फिर से लिख सकते हैं सरणी के पीछे की ओर की ओर; आप लगभग सभी को प्राप्त करेंगे, साबित करते हैं कि फ़ंक्शन लौटने के बाद तक डेटा नहीं भेजा गया था)। अपने सहयोगियों यहाँ से एक से बनाम मोनो HttpListener HttpListener की स्थानीय मशीन प्रदर्शन घाटा पर

अधिक विवरण: https://www.linkedin.com/pulse/http-inefficiency-dominika-blach

+0

अच्छा जवाब। मेरे मामले में मैं सोच रहा हूं कि क्यों मेरे ग्राहक कुछ सौ कनेक्शन के बाद संदेश भेजना बंद कर देते हैं। मैं सर्वर के लिए एक WebRequest सर्वर के लिए एक HttpListener का उपयोग करें। थोड़ी देर के बाद वे बस सरल स्टॉप, कोई त्रुटि नहीं, ऐसा लगता है कि कोई संसाधन उपलब्ध नहीं था। 'ServicePointManager.DefaultConnectionLimit' और 'ServicePointManager.MaxServicePoints' के साथ खेलना कुछ सौ कनेक्शनों के बाद मदद नहीं करता है, मुझे एक ही त्रुटि मिली है। मैंने KeepAlive के साथ प्रयास किया है लेकिन कोई भाग्य नहीं है। कोई उपाय? धन्यवाद। – GBrian

+2

अधिकतर आप एक या दोनों सिरों पर अनुरोध और प्रतिक्रिया को सही तरीके से बंद नहीं कर रहे हैं, या आपने क्लाइंट साइड पर थ्रेड पूल (जैसे टाइमर का उपयोग करके) का उपयोग किया है और आप उस थ्रेड पूल थ्रेड से अपवाद फेंक रहे हैं। एक बार धागा पूल धागा करता है यह कभी भी पुनर्निर्मित नहीं होता है। एक बार जब आप थ्रेड पूल धागे से बाहर निकलते हैं तो उन्हें उपयोग करने वाले कुछ भी जैसे टाइमर ऑब्जेक्ट्स अब काम नहीं करते हैं। – huntharo

+0

नीचे दिए गए प्रश्न के उत्तर के रूप में पोस्ट किए गए HttpListener नमूना कोड की जांच करें। देखें कि क्या आप अनुरोधों को एक ही तरीके से संभालने या अपने सर्वर का एक नया संस्करण बनाने के लिए इसका उपयोग कर रहे हैं और देखें कि समस्या बनी रहती है या नहीं। http://stackoverflow.com/questions/10485985/bad-performance-when-offering-files-to-download-with-httplistener/19202175#19202175 – huntharo

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