3

我有一个基于 Java 的服务,当我运行它时抛出意外的 SSL 异常“套接字已关闭”......或者有时“数据以非数据状态接收”。当我通过添加 jvmArgs 配置远程调试器时: -Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=n,address=5050 ,然后运行它永远不会抛出此异常。这个选项有什么东西可以修改服务的行为吗?

例外:

javax.net.ssl.SSLProtocolException: Data received in non-data state: 6
    at sun.security.ssl.SSLSocketImpl.readRecord(SSLSocketImpl.java:1061)
    at sun.security.ssl.SSLSocketImpl.readDataRecord(SSLSocketImpl.java:884)
    at sun.security.ssl.AppInputStream.read(AppInputStream.java:102)
    at org.apache.http.impl.io.AbstractSessionInputBuffer.fillBuffer(AbstractSessionInputBuffer.java:149)
    at org.apache.http.impl.io.SocketInputBuffer.fillBuffer(SocketInputBuffer.java:110)
    at org.apache.http.impl.io.AbstractSessionInputBuffer.read(AbstractSessionInputBuffer.java:191)
    at org.apache.http.impl.io.ContentLengthInputStream.read(ContentLengthInputStream.java:164)
    at org.apache.http.conn.EofSensorInputStream.read(EofSensorInputStream.java:138)
    at java.security.DigestInputStream.read(DigestInputStream.java:161)
    at java.io.FilterInputStream.read(FilterInputStream.java:133)
    at com.amazonaws.services.s3.internal.ChecksumValidatingInputStream.read(ChecksumValidatingInputStream.java:97)
    at java.io.FilterInputStream.read(FilterInputStream.java:133)
    at java.io.FilterInputStream.read(FilterInputStream.java:107)
    at javax.crypto.CipherInputStream.getMoreData(CipherInputStream.java:103)
    at javax.crypto.CipherInputStream.read(CipherInputStream.java:224)
    at java.io.FilterInputStream.read(FilterInputStream.java:133)
    at java.io.FilterInputStream.read(FilterInputStream.java:107)
    at <mypackagenameremovedforanonymity>.GetObjectActivity.enact(GetObjectActivity.java:118)

上下文:我正在读取包装 SSL 套接字的 InputStream

4

3 回答 3

4

这可能是其他人在使用 AWS 开发工具包和垃圾收集时遇到的问题。我有同样的问题。从 S3 输入流读取会因各种套接字/SSL 错误而失败,当我尝试隔离或调试它时,问题就会消失。原来 S3 客户端连接正在被垃圾收集,因为输入流没有保留它。我找到了以下链接,它解决了我的问题。

https://forums.aws.amazon.com/thread.jspa?messageID=438171

瑞克

PS 为了清楚起见,上面的链接是在 Android 上运行的,但问题和解决方案在所有平台上都是通用的(我在 Windows 上运行的 JDK 7 上遇到了它)。

于 2013-08-29T18:41:29.233 回答
0

如果您在 linux 中运行应用程序,请尝试以下操作:

  • 运行您的应用程序,然后使用 'ps -aux | 检查程序调用 grep java'
  • 在调试模式下运行,并在使用 'ps -aux | 检查程序调用后运行 grep java'
  • 这将使您确定 jvm 路径

另一个非常重要的事情是通过将以下代码添加到您的应用程序来检查您的系统属性:

System.getProperties().list(System.out);
  • 之后,比较正常运行应用程序和调试模式的输出。
于 2013-07-31T19:59:29.687 回答
0

当抛出Data received in non-data state的错误时,检查socket的输出流是否关闭但输入流没有关闭并继续发送/接收数据,并且socket也没有关闭。最后关闭套接字流和套接字可能有助于解决问题。

于 2016-07-22T08:12:20.160 回答