1

这让我有点发疯。我在 Android 设备上运行以下内容:

SSLContext sc = SSLContext.getInstance("TLS");
sc.init(null, trustAllCerts, new java.security.SecureRandom());
SSLSocketFactory sslsocketfactory = (SSLSocketFactory) sc.getSocketFactory();

Socket s = (SSLSocket) sslsocketfactory.createSocket(someHost, somePort);

OutputStream o = s.getOutputStream();

我观察到无线连接是否断线:

OutputStream o = s.getOutputStream();

无限期地阻塞。

太棒了!!!!我可以建立一个超时,如果超时,我可以假设存在一些通信问题。

除了我找不到 Socket.getOutputStream() 应该阻止的任何确认。
不在 Oracle 的 javadoc 中,也不在 Google 的 Android javadoc 中。

这是一种依赖 JVM 的东西吗?我使用 Android 的 dalvik jvm 遇到了这种行为。

有没有人经历过这样的事情?

标记

编辑以添加评论:

我对“SSLSocket.getOutputStream() 在必要时启动 SSL 握手”很感兴趣

什么定义了“如有必要”?这种行为(启动 SSL 握手)是 JVM 规范所要求的吗?IOW 跨 JVM 有保证吗?

当我关闭我的 wifi connex 并尝试创建一个套接字来与我的服务器通信时,我遇到了这种行为。套接字创建工作正常,我已经阅读了原因。我还阅读了确定套接字连接是否可以工作的唯一方法是用它读/写数据。这对我来说不是一个选择,我想知道我是否可以依靠 getOutputStream() 在一分钟内不返回来表示存在连接问题。

想法?评论?

4

1 回答 1

1

SSLSocket.getOutputStream()必要时启动 SSL 握手,这涉及读取,可能会阻塞。您应该在调用它之前在套接字上设置读取超时,使用Socket.setSoTimeout().

我对“SSLSocket.getOutputStream() 在必要时启动 SSL 握手”很感兴趣

什么定义了“如有必要”?

如果尚未完成,或者当前 SSL 会话已失效。

这种行为(启动 SSL 握手)是 JVM 规范所要求的吗?IOW 跨 JVM 有保证吗?

不,这是TLS/SSL 规范所要求的。

我还阅读了确定套接字连接是否可以工作的唯一方法是用它读/写数据。这不是我的选择。

是的。你在做。SSL 握手包括读取和写入。

我想知道我是否可以依靠 getOutputStream() 在一分钟左右不返回来表明存在连接问题。

您可以依靠在SocketTimeoutException握手期间被抛出来表明连接不起作用,前提是您设置了一个合理的超时时间,Socket.setSoTimeout()正如我在回答中提到的那样。一分钟是合理的。

于 2013-06-05T03:26:36.287 回答