4

有没有办法让 SSLSocket 等到握手完成而不使用 addHandshakeListener() 方法?我希望它在完成握手之前阻止。

编辑:再澄清一点:最初使用常规(非 SSL)套接字(这是必需的,因为必须在实际握手发生之前将包发送到服务器)。使用SslSocketFactory.createSocket将此套接字“转换”为 SSLSocket 。我的问题是,现在是否有办法同步握手。

4

1 回答 1

7

SSLSocket.startHandshake() 是第一次开始对等方之间的握手时的同步调用,它将阻塞调用线程,直到握手完成:

... ...

// initial handshake between peers, don't need Listener:
sslSocket.startHandshake(); // <- this will block the calling thread.
// handshake is completed at this point

... ...

这在Android API中没有完整记录,请参阅原始Java API以获取完整的 javadoc:

在此连接上启动 SSL 握手。常见原因包括需要使用新的加密密钥、更改密码套件或启动新会话。要强制完成重新身份验证,当前会话可能会在开始此握手之前失效。

如果数据已在连接上发送,则在此握手期间继续传输。当握手完成时,这将通过一个事件发出信号。此方法对于连接上的初始握手是同步的,并在协商的握手完成时返回。某些协议可能不支持现有套接字上的多次握手,并可能引发 IOException。

如果您在对等点之间多次操作握手,情况会变得非常复杂,在某些情况下(当您需要侦听器时)可能是异步调用,请查看此在线文档Java 中的基础网络以获取更多详细信息。

于 2012-10-30T21:48:29.103 回答