2012-10-12 2 views
8

모든 소스/샘플, 나는 SSLEngine의 라이프 사이클을 알고있는 것처럼자바 NIO2 AsynchronousSocketChannel/AsynchronousServerSocketChannel 및 TLS/SSL을 사용할 수 NIO2에 TLS/SSL 지원없이있는 인터넷에

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

연결이 AsynchronousSocketChannel.connect와 다릅니다. & & AsynchronousServerSocketChanne.accept, TLS/SSL은 AIO 구현 안에 캡슐화되어야합니다. 어떻게 둘 다 사용할 수 있습니까? 참고 : Grizzly 프로젝트에서 이미 구현 한 비디오에 대해 소스 코드를 보았지만 TLS/SSL 통합이 아닌 AIO를 보았습니다.

미리 감사드립니다!

+0

연결의 수명주기는 동일합니다. 단지 연결 일뿐입니다. 그러나 SSLEngine을 비 차단 NIO와 통합하는 것은 다른 이유로도 어렵습니다. 예를 들어 독서를해야 할 때 작성해야하는 경우와 그 반대의 경우 * 작업을 처리하는 방법 : 시도하지 않는 것이 좋습니다. 비동기 I/O. – EJP

+0

추신 : 내 현상금 설명에 나쁜 철자가 나타났습니다. 누구나 이것을 편집하는 방법을 알고 있습니까? –

+0

SSLEngine을 사용하는 AsyncSSLSocketChannel을 이후에 구현했다고 내 의견에 추가해야합니다. 예상대로 쉽지 않았습니다. – EJP

답변

3

원래 질문에 대한 의견이 실제로 맞습니다. SSLEngineByteBuffer을 직접 사용하여 작동합니다.

이것은 AIO와 호환됨을 의미합니다. 먼저 연결을 수락하면됩니다. 그런 다음 클라이언트가 연결하여 초기 쓰기를 수행합니다. 버퍼링 된 데이터가 충분한 지 확인하려면 handshake statusstatus을 사용하십시오. 다른 쪽에서 더 많은 데이터를 제공해야하는 경우 엔진에서 계속 NEED_UNWRAP을 알려줍니다. 따라서 ByteBuffer 객체의 큐를 유지해야합니다. 동일한 작업을 계속하기 전에 더 많은 데이터를 다른 쪽 끝으로 보내야하는 경우 엔진에서 계속 "NEED_WRAP"을 말합니다. 핸드 셰이크 상태에서 "Finished"를 얻을 때까지 계속 진행합니다.

그러나 Netty와 같은 것을 사용하면 훨씬 간단합니다. Netty는 알파 단계 4에서 AIO를 지원했습니다. 그러나 AIO는 NIO보다 느린 것으로 나타났습니다. 따라서, 그것은 제거되었습니다.

그러나 Netty는 NIO 또는 AIO를 직접 사용하는 것보다 간단하게 만들뿐만 아니라 AIO를 다시 도입 할 경우이 둘 사이를 쉽게 전환 할 수 있습니다.

Netty에서 SSL을 사용하는 전체 예제는 here입니다.

+0

당신의 의견을 보내 주셔서 감사합니다, 나는 SSLEngine을 사용하는 방법을 알고 있고 전통적인 nio와 함께 작동하는 구현을해야한다고 지적해야합니다. 그러나 AIO 버전에서는 코드에 어떤 모양을 넣으려고 애쓴다. 필자의 경우, 자신 만의 효율적인 AIO 구현을 구현하는 방법을 배우고 싶었다. (나는 단지 교착 상태와 핸드 쉐이크 중에 완료 핸들러를 조정하는 관점에서 몇 가지 포인터를 현명하게 디자인해야한다). –

+0

포인터 환호에 AIO를 사용하여 이전 버전의 netty를 살펴보십시오. –

+0

코드가 실제로 동일하다는 것을 알 수 있습니다. SSLHandler는 파이프 라인 처리기이며 NIO 또는 AIO 채널 팩토리와 함께 사용되는 경우에도 동일합니다. https://github.com/netty/netty/blob/c149f4bcc0c0d02aa1abcd5e39c155a9e598822e/handler/src/main/java/io/netty/handler/ ssl/SslHandler.java – pjulien