大家好,又见面了,我是你们的朋友全栈君。
背景:
服务端通讯方式:TCP/IP socket 短链接。
首先看下我的最开始的socket代码:
public static byte[] sendMessage(String url, int port, byte[] request, int timeout) {
byte[] res = null;
Socket socket = null;
InputStream is = null;
OutputStream os = null;
try {
socket = new Socket(url, port);
socket.setSoTimeout(timeout);
is = socket.getInputStream();
os = socket.getOutputStream();
os.write(request);
os.flush();
ByteArrayOutputStream bos = new ByteArrayOutputStream();
byte[] buffer = new byte[8192];
int count;
while ((count = is.read(buffer)) != -1) {
bos.write(buffer, 0, count);
}
res = bos.toByteArray();
} catch (Exception ex) {
ex.printStackTrace();
} finally {
try {
if (os != null) {
os.close();
}
if (is != null) {
is.close();
}
if (socket != null) {
socket.close();
}
} catch (Exception e) {
e.printStackTrace();
}
}
return res;
}
上面这段代码,是最常用的的socket 发送方式,对于一般的socket链接都适用。但是在这里跟银行联调时一直报了一个错:
java.net.SocketException: Connection reset
at java.net.SocketInputStream.read(SocketInputStream.java:196)
at java.net.SocketInputStream.read(SocketInputStream.java:122)
at java.net.SocketInputStream.read(SocketInputStream.java:108)
经查阅问题描述如下:
1,如果一端的Socket被关闭(或主动关闭,或因为异常退出而 引起的关闭),另一端仍发送数据,发送的第一个数据包引发该异常(Connect reset by peer)。
2,一端退出,但退出时并未关闭该连接,另一端如果在从连接中读数据则抛出该异常(Connection reset)。简单的说就是在连接断开后的读和写操作引起的。
我这里是客户端,socket最后关闭,原因只能是2。说明对方在把数据返回后,就把socket关闭了,而客户端还在读数据。所以就connection reset。
解决方案;
使用InputStream.available判定是否还有可读字节
available()
返回下一次对此输入流调用的方法可以不受阻塞地从此输入流读取(或跳过)的估计剩余字节数。
如下:
public static byte[] sendMessage(String url, int port, byte[] request) {
byte[] res = null;
Socket socket = null;
InputStream is = null;
OutputStream os = null;
try {
socket = new Socket(url, port);
os = socket.getOutputStream();
os.write(request);
os.flush();
is = socket.getInputStream();
ByteArrayOutputStream bos = new ByteArrayOutputStream();
byte[] buffer = new byte[1024];
int count = 0;
do {
count = is.read(buffer);
bos.write(buffer, 0, count);
} while (is.available() != 0);
res = bos.toByteArray();
os.close();
is.close();
socket.close();
} catch (Exception ex) {
try {
if (is != null) {
is.close();
}
if (socket != null)
socket.close();
} catch (Exception e) {
}
}
return res;
}
发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/158570.html原文链接:https://javaforall.cn
【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛
【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...