【问题标题】:Java 7 Async SecureSocket?Java 7 异步安全套接字?
【发布时间】:2013-02-27 14:51:22
【问题描述】:

Java 7 附带异步 I/O。这里有谁知道我是否可以使用它对SecureSocket 进行异步调用?

改写:如果我使用sslContext.getSocketFactory().createSocket("127.0.0.1", 42),那么使用socket.getOutputStream()socket.getInputStream()以阻塞方式进行通信;为了访问异步函数,我需要进行哪些更改才能重新编写代码以异步工作?

【问题讨论】:

    标签: java ssl asynchronous io


    【解决方案1】:

    具有非阻塞 I/O 的 Java 中的 SSL/TLS 在 Java 7 中并不是新事物,而是在 Java SE 5 中引入的。这可以使用 SSLEngine 而不是套接字来完成。

    SSLEngine 是出了名的难用。原则上,您可以使用Channels 类在通道和InputStream/OutputStreams 之间进行转换,但在使用SSLEngine 本身方面还有很多工作要做。这里有几点建议:

    【讨论】:

    • 我读到异步 I/O 比非阻塞 I/O 更好。请参阅对this comment 的回复。它并没有明显更好,但应该会更好,而且它只在 Java 7 中引入。
    • 确实,但即使使用 NIO2,您也必须使用频道和 SSLEngine。额外的复杂性是否值得性能改进,我不知道。有一个 [J.F. Arcand (Grizzly 项目) 的演讲](parleys.com/d/318),但似乎没有谈论 SSL。
    【解决方案2】:

    正如 Bruno 正确提到的,SSLEngine 是执行异步 SSL 的标准方式。但是那个类真的很难用。

    前段时间我遇到了同样的问题,最终编写了自己的库。那里有一些示例,当然还有 Netty 等项目中的代码。但是这两个选项都不是健壮的或易于重用的。

    TLS Channel 将 SSLEngine 包装在 ByteBuffer 中,并允许像普通的 SocketChannel 一样使用它。

    【讨论】:

      【解决方案3】:

      异步 ​​IO(Java NIO 的一部分)不使用流,而是使用通道、缓冲区和选择器。不过,您绝对仍然可以连接到安全服务器。但是,您当前的代码需要进行大量更改,因此您可能不想更新到异步 IO,除非您有充分的理由。

      我推荐this tutorial作为起点。

      【讨论】:

        猜你喜欢
        • 2013-04-09
        • 2012-04-26
        • 1970-01-01
        • 2010-11-16
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-11-12
        相关资源
        最近更新 更多