大家好,又见面了,我是你们的朋友全栈君。
背景: 服务端通讯方式:TCP/IP socket 短链接。 首先看下我的最开始的socket代码:
代码语言:javascript复制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() 返回下一次对此输入流调用的方法可以不受阻塞地从此输入流读取(或跳过)的估计剩余字节数。 如下:
代码语言:javascript复制 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;
}
发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/158570.html原文链接:https://javaforall.cn