【问题标题】:Block SSLSocket until handshake is done?阻止 SSLSocket 直到握手完成?
【发布时间】:2012-10-18 13:59:04
【问题描述】:

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

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

【问题讨论】:

标签: java android ssl


【解决方案1】:

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 中没有完整记录,完整的 javadoc 参见原始 Java API

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

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

如果您在对等点之间多次操纵握手,情况会变得相当复杂,在某些情况下(当您需要侦听器时)可能是异步调用,请查看此在线文档Fundamental Networking in Java 了解更多详细信息。

【讨论】:

  • @UkuLoskit,我从未在Android项目中使用过startHandshake() API,但是根据javadoc,只要是第一次握手,就会同步涉及startHandshake()。请注意,Android 从 API 级别 11 开始限制 UI 线程上的网络操作,因此在您的 Android 应用中使用此网络 API 时要小心,并确保您的代码可以跨不同的 API 级别工作。
  • @UkuLoskit,您甚至不需要使用startHandshake(),只需使用 SSLSocket 中的 I/O 流开始读/写,这将启动握手,并且不会发生在它成功完成之前。
  • 好吧,我的错。我阅读了文档,但我的应用程序运行方式导致我错误地认为它没有阻塞。我会在两个小时内奖励你赏金(由于限制,现在不能这样做)。
猜你喜欢
  • 2017-10-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-09-01
  • 2016-07-13
  • 1970-01-01
  • 1970-01-01
  • 2021-01-02
相关资源
最近更新 更多