2012-10-12 14 views
8

सभी स्रोतों/इंटरनेट कि NIO2 पर उपलब्ध TLS/SSL समर्थन के बिना कर रहे हैं पर नमूने,जावा NIO2 AsynchronousSocketChannel/AsynchronousServerSocketChannel और TLS/SSL

java.nio.channels.AsynchronousSocketChannel java.nio.channels.AsynchronousServerSocketChannel

मैं SSLEngine जीवन चक्र को समझने के रूप में कनेक्शन की AsynchronousSocketChannel.connect & & AsynchronousServerSocketChanne.accept, TLS/SSL AIO कार्यान्वयन के अंदर समझाया जाना चाहिए से अलग है, इसलिए मैं उन दोनों को कैसे उपयोग कर सकते हैं ...? नोट: मैं इतना में ग्रिजली परियोजना एक वीडियो है कि वे के बारे में बात पहले से ही इसे लागू मैं स्रोत कोड पर देखने के लिए, लेकिन मैं AIO देखा था, लेकिन नहीं TLS/SSL एकीकरण ...

अग्रिम धन्यवाद!

+0

कनेक्शन के जीवन चक्र में ही है: यह केवल एक कनेक्शन नहीं है। हालांकि गैर-अवरुद्ध एनआईओ के साथ एसएसएलईजीएनआईएन को एकीकृत करना अन्य कारणों के लिए काफी कठिन है, जैसे कि जब आप पढ़ना चाहते हैं, और * इसके विपरीत, * और कार्यों को कैसे संभालना है: मैं इसे कल्पना करने की कल्पना नहीं करता Async I/O के साथ। – EJP

+0

पीएस: बस मेरी बाउंटी टिप्पणी पर खराब वर्तनी देखी, किसी को भी यह कैसे संपादित करना है? –

+0

मुझे अपनी टिप्पणी में जोड़ना चाहिए कि मैंने बाद में एक AsyncSSLSocketChannel लागू किया है जो SSLEngine का उपयोग करता है। भविष्यवाणी के अनुसार, यह आसान नहीं था। – EJP

उत्तर

3

मूल प्रश्न पर टिप्पणी वास्तव में सही है। SSLEngine सीधे ByteBuffer का उपयोग कर संचालित करता है।

यह AIO के साथ संगत है इसका मतलब यह है। आप एक कनेक्शन स्वीकार कर शुरू करते हैं। क्लाइंट तब प्रारंभिक लेखन को जोड़ता है और करता है। यह निर्धारित करने के लिए कि क्या आपके पास handshake status और status का उपयोग करने वाले पर्याप्त डेटा buffered हैं। यदि इंजन को दूसरे छोर से अधिक डेटा की आपूर्ति की जानी चाहिए तो इंजन आपको "NEED_UNWRAP" बताएगा। तो आपको बाइटबफर ऑब्जेक्ट्स की कतार रखना होगा। वही बात, इंजन आपको "NEED_WRAP" बताएगा यदि इसे जारी रखने से पहले अन्य डेटा को दूसरे छोर पर भेजने की आवश्यकता है। जब तक आप हैंडशेक स्थिति से "समाप्त" नहीं हो जाते तब तक आप आगे बढ़ते रहते हैं।

मेरा सुझाव है लेकिन आप Netty की तरह कुछ है जो इस बहुत सरल बनाता है का प्रयोग करेंगे। यह ध्यान दिया जाना चाहिए कि नेटी को 4 के अल्फा चरणों में एआईओ के लिए समर्थन मिला था। हालांकि, यह दिखाया गया था कि एआईओ एनआईओ से धीमा था। इसलिए, इसे हटा दिया गया था।

हालांकि, न केवल Netty बातें सीधे NIO या AIO उपयोग करने की कोशिश कर से अधिक आसान कर देगा, लेकिन यह भी आसान दोनों के बीच स्विच करने के लिए करता है, तो कभी AIO फिर से शुरू की है कर देगा।

Netty साथ SSL का उपयोग कर की एक पूरी उदाहरण here पाया जा सकता है।

+0

आपके इनपुट के लिए धन्यवाद, मुझे ध्यान देना चाहिए कि मुझे पता है कि एसएसएलईजीएनईएन का उपयोग कैसे करें और पारंपरिक एनओओ के साथ कार्यान्वयन का कार्यान्वयन करें। एआईओ संस्करण हालांकि मैं कोड पर कोई भी आकार डालने के लिए संघर्ष करता हूं। मेरे मामले में सीखना चाहता था कि कैसे अपना खुद का रोल करके एक कुशल एआईओ कार्यान्वयन को कार्यान्वित किया जाए। (मुझे डेडलॉक्स के मामले में डिजाइनरों के अनुसार कुछ पॉइंटर्स की आवश्यकता है और हैंडशेक के दौरान पूरा करने वाले हैंडलर को समन्वयित करना)। –

+0

पॉइंटर्स चीयर्स के लिए एआईओ के साथ नेटटी के पुराने संस्करण पर अब एक नज़र डालें। –

+0

आप पाएंगे कि कोड वास्तव में वही है। एसएसएलहैंडलर एक पाइपलाइन हैंडलर है और यह कोई फर्क नहीं पड़ता कि इसका उपयोग एनआईओ या एआईओ चैनल फैक्ट्री के साथ किया जाता है https://github.com/netty/netty/blob/c149f4bcc0c0d02aa1abcd5e39c155a9e598822e/handler/src/main/java/io/netty/handler/ SSL/SslHandler.java – pjulien

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