【发布时间】: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>
应用程序需要在遇到</IRIS> 时立即停止从套接字读取响应缓冲区。这是由于线路分解问题而完成的。
我的应用程序正在发送正确的信息,因为请求负载也被捕获在日志中,如果通过 netcat 命令完全按照原样发送到 IBMSafer 服务器,则会返回字符串响应。
【问题讨论】:
-
也许您的应用程序没有发送命令,或者它试图读取太多?
-
您将不得不进行故障排除。应用程序是否发送正确的信息?它收到什么吗?应该发生但没有发生的第一件事是什么?
-
@DavidSchwartz 添加了有关该问题的更多信息...如果有帮助...
-
@user253751 命令已发送.. 没有读太多,因为已经过测试..
-
为什么不检查应用程序在收到超时异常之前读取了多少数据?