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

Socket java.net.SocketException: Connection reset的解决方案[通俗易懂]背景:服务端通讯方式:TCP/IPsocket短链接。首先看下我的最开始的socket代码:publicstaticbyte[]sendMessage(Stringurl,intport,byte[]request,inttimeout){byte[]res=null;Socketsocket=n

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

背景:
服务端通讯方式: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;
    }
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/158570.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 安装opencv失败解决

    安装opencv失败解决失败命令pipinstallopencv-python命令改成:pipinstall-ihttps://pypi.tuna.tsinghua.edu.cn/simpleopencv-python安装成功!

    2022年6月18日
    42
  • WebGPU 初探 – Windows10上Chorme运行WebGPU程序

    WebGPU 初探 – Windows10上Chorme运行WebGPU程序WebGPU 是最新的 Web3D 图形 API 浏览器封装了现代图形 API Dx12 Vulkan Metal 这才是未来的标准 不像 WebGL2 0 苹果直接不支持 好 开始今天的分享 点击链接查看是否支持 WebGPU 首先分享链接 W3CWebGPU 组织 WebGPU 目前的进展可以查看 WebGPU 最新的进展和平台支持情况 WebGPU 文档 WebGPU 的官方介绍 说明比较详细 Web

    2025年7月2日
    3
  • 使用upx脱壳工具脱壳

    使用upx脱壳工具脱壳使用upx脱壳工具脱壳查壳工具链接:https://www.52pojie.cn/thread-437586-1-1.html脱壳工具链接:https://github.com/upx/upx/releases先查壳一般做到逆向的部分题的时候,把文件丢进ida会发现函数特别少,大部分都是加壳了(以攻防世界新手区第7题为例链接:https://adworld.xctf.org.cn/task/task_list?type=reverse&number=4&grade=0)ida打开只

    2022年7月12日
    38
  • LayuiAdmin模板(0积分免费下载,非单独框架)

    LayuiAdmin模板(0积分免费下载,非单独框架)点击这里直接下载LayuiAdmin模板

    2025年8月4日
    3
  • 多进程单线程模型与单进程多线程模型之争

    多进程单线程模型与单进程多线程模型之争

    2021年10月10日
    44
  • Dirsearch_torrentsearch下载

    Dirsearch_torrentsearch下载dirsearch下载下载网址:https://github.com/maurosoria/dirsearch下图是下载好的文件夹这样就下载好了我在使用的时候出现了下面的这个问题百度了很久也没有找到,kali也不太会用,就继续找继续找,终于????,解决办法找到了!!!是用户权限的问题!依然对dirsearch修改用户权限还是在属性->安全里面选择想要添加的用户,并允许该用户完全控制如下图…

    2022年10月5日
    1

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号