![](/img/trans.png)
[英]Java Socket : java.net.SocketTimeoutException: Read timed out
[英]Application throwing java.net.SocketTimeoutException: Read timed out while reading from TCP socket
我有一个应用程序通过 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]
该错误与服务器的响应延迟无关,因为我可以在几毫秒内使用此命令连接到服务器并从我的腻子 session 获得响应:
nc --ssl <Server_IP>
似乎应用程序无法从请求队列中读取/或寻找更多无限期卡住的缓冲区,一旦达到超时,就会引发错误。
从应用程序的角度来看,配置如下:
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 服务器,则会返回字符串响应。
该问题已得到修复。 出现问题是因为我使用的是来自客户端应用程序的普通 Socket 连接,但 IBMSafer 实际上有一个 SSLServerSocket,它仅在客户端也使用 SSL 安全通道时才建立连接。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.