Socket java.net.SocketException: Connection reset的解决方案[通俗易懂]

2022-09-14 10:17:01 浏览数 (1)

大家好,又见面了,我是你们的朋友全栈君。

背景: 服务端通讯方式: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

0 人点赞