【问题标题】:Application throwing java.net.SocketTimeoutException: Read timed out while reading from TCP socket应用程序抛出 java.net.SocketTimeoutException:从 TCP 套接字读取时读取超时
【发布时间】:2021-07-08 16:07:59
【问题描述】:

我有一个应用程序通过 TCP/IP 通道对IBMSafer 系统进行同步调用。

接收到的数据分别以<IRIS>标签开始和结束,在应用程序中配置为仅轮询数据,直到我们收到</IRIS>结束标签。

但是,应用程序抛出以下异常:

java.net.SocketTimeoutException: Read timed out
    at java.net.SocketInputStream.socketRead0(Native Method) ~[?:1.8.0_282]
    at java.net.SocketInputStream.socketRead(SocketInputStream.java:116) ~[?:1.8.0_282]
    at java.net.SocketInputStream.read(SocketInputStream.java:171) ~[?:1.8.0_282]
    at java.net.SocketInputStream.read(SocketInputStream.java:141) ~[?:1.8.0_282]
    at sun.nio.cs.StreamDecoder.readBytes(StreamDecoder.java:284) ~[?:1.8.0_282]
    at sun.nio.cs.StreamDecoder.implRead(StreamDecoder.java:326) ~[?:1.8.0_282]
    at sun.nio.cs.StreamDecoder.read(StreamDecoder.java:178) ~[?:1.8.0_282]
    at java.io.InputStreamReader.read(InputStreamReader.java:184) ~[?:1.8.0_282]
    at java.io.BufferedReader.fill(BufferedReader.java:161) ~[?:1.8.0_282]
    at java.io.BufferedReader.read1(BufferedReader.java:212) ~[?:1.8.0_282]
    at java.io.BufferedReader.read(BufferedReader.java:286) ~[?:1.8.0_282]
    at java.io.Reader.read(Reader.java:140) ~[?:1.8.0_282]

该错误与服务器的响应延迟无关,因为我可以在几毫秒内使用此命令连接到服务器并从我的 putty 会话中获得响应:

nc --ssl

似乎应用程序无法从请求队列中读取/或寻找更多无限期卡住的缓冲区,一旦达到超时,就会抛出错误。

从应用程序的角度来看,配置如下:

READ FROM -- `SERVER IP`
PORT --  `PORT NUMBER`
READ FROM SOCKET STARTS FROM --- `""` (empty string)
READ FROM SOCKET TILL --- `</IRIS>` is encountered.
OPEN SOCKET PER MSG --- `NO`
TIMEOUT --- `5 sec`

我已经为此苦恼了好几个小时。

编辑:应用程序应该发送如下内容:

<IRIS> .... request payload .... </IRIS>

并阅读类似的内容:

<IRIS> .... response payload .... </IRIS>

应用程序需要在遇到&lt;/IRIS&gt; 时立即停止从套接字读取响应缓冲区。这是由于线路分解问题而完成的。

我的应用程序正在发送正确的信息,因为请求负载也被捕获在日志中,如果通过 netcat 命令完全按照原样发送到 IBMSafer 服务器,则会返回字符串响应。

【问题讨论】:

  • 也许您的应用程序没有发送命令,或者它试图读取太多?
  • 您将不得不进行故障排除。应用程序是否发送正确的信息?它收到什么吗?应该发生但没有发生的第一件事是什么?
  • @DavidSchwartz 添加了有关该问题的更多信息...如果有帮助...
  • @user253751 命令已发送.. 没有读太多,因为已经过测试..
  • 为什么不检查应用程序在收到超时异常之前读取了多少数据?

标签: java sockets tcp


【解决方案1】:

问题已解决。出现问题是因为我使用的是来自客户端应用程序的普通 Socket 连接,但 IBMSafer 实际上有一个 SSLServerSocket,它仅在客户端也使用 SSL 安全通道时才建立连接。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-01-29
    • 2011-07-13
    • 2015-10-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-04-02
    • 1970-01-01
    相关资源
    最近更新 更多