2012-11-28 49 views
6

मैं नेटटी के साथ एक HTTP सर्वर लिख रहा हूँ। जब मैं सर्वर बूटस्ट्रैप बनाता हूं तो मैंने रख-रखाव विकल्प सेट किया है। bootstrap.setOption("child.keepAlive", true); प्रत्येक बार जब मैं एक HTTP प्रतिक्रिया लिखता हूं, तो मैंने रख-रखाव हेडर सेट किया और प्रतिक्रिया लिखने के बाद चैनल बंद कर दिया।नेटटी: क्या मुझे चैनल को बंद करना चाहिए यदि यह 'रख-रखाव' कनेक्शन है?

rep.setHeader("Connection", "keep-alive"); 
channel.write(rep).addListener(ChannelFutureListener.CLOSE); 

मुझे यकीन नहीं है कि मुझे चैनल बंद करना है या नहीं।

+0

यह देखने के लिए मुश्किल है कि रहस्य क्या है। आप गंभीरता से नहीं सोच सकते कि एक चैनल बंद करने से इसे जीवंत बना दिया जाता है। – EJP

उत्तर

7

मान लें कि आप एक HTTP 1.1 सर्वर लिख रहे हैं, आपको प्रतिक्रिया भेजने के बाद कनेक्शन को डिफ़ॉल्ट रूप से खोलना चाहिए। यदि, किसी कारण से, आप इसे किसी भी तरह से बंद करने का निर्णय लेते हैं, तो आपको

Connection: close 

प्रतिक्रिया में शामिल होना चाहिए।

ध्यान दें कि

bootstrap.setOption("child.keepAlive", true); 

सॉकेट पर keepalive विकल्प चालू हो जाती है और HTTP के साथ कोई संबंध नहीं है; बल्कि, "असली" यातायात की अनुपस्थिति में टूटे हुए कनेक्शन का पता लगाने के लिए यह एक प्रकार का वॉचडॉग मैकेनिम है।

+1

धन्यवाद @ चालीस-दो! मेरा इरादा कनेक्शन को जिंदा रखना था। बस इसकी पुष्टि करने के लिए: क्या मुझे इस भाग की आवश्यकता है। .addListener (ChannelFutureListener.CLOSE); 'प्रतिक्रिया लिखने के बाद? – woodings

+0

अधिकांश ऑपरेटिंग सिस्टम के लिए, डिफ़ॉल्ट 'SO_KEEPALIVE' टाइमआउट बहुत लंबा है (उदाहरण के लिए लिनक्स में 7200 सेकेंड।), इसलिए मुझे इससे अधिक उम्मीद नहीं होगी। यदि ग्राहक द्वारा किसी निश्चित समय के लिए कोई अनुरोध नहीं भेजा गया है तो आपको कनेक्शन बंद करना चाहिए। – trustin

3

ध्यान दें कि आप भी सामग्री की लंबाई निर्दिष्ट करना होगा:

response.headers().set(CONTENT_LENGTH, response.content().readableBytes()); 

तो रिसीवर पता लगा सकते हैं कि जहां संदेश समाप्त हो गया है। अन्यथा, प्राप्त संदेश सिर्फ संदेश के लिए इंतजार कर रहे हैं।

और, स्पष्ट होने के लिए, आपको ".addListener (ChannelFutureListener.CLOSE) लिखना नहीं चाहिए;" यदि आप चाहते हैं कि आपका कनेक्शन खुला रहे।