针对java.net.SocketException: Connection reset的问题排查

14 篇文章 0 订阅

针对java.net.SocketException: Connection reset的问题排查

  最近在与第三方系统对接接口时,需要用到socket这种方式,在调试过程中,一直出现java.net.SocketException: Connection reset 这个错误,网上试了很多种的方法,都不管用。

   经过网上搜,确实看到很多人的分析也有道理,短连接服务端退出未断开连接客户端未读完数据等等。

1.tcp工具发送成功

  因为想到socket网上也有一些工具可以发请求,因此就下载了一个SocketTool.exe,使用它的工具,创建了一个tcp client发送请求,竟然发送成功了!!!那这样看来,问题不是人家服务端了,既然有一种方式能成功,就只能说明我们写的方法有问题。就像锁创造出来了,有人能开,但咱开不了,只能说明咱配的钥匙有问题。
在这里插入图片描述

2.发送成功的代码

  本着不信邪的原因,既然小工具发送成功了,那肯定网上也有对应的方法,在全网几乎要搜遍了的情况下,终于试成功了,如下代码:

public static String tcpPost(String clientIp, int clientPort, String msg) {
        try {
            Socket socket = new Socket(clientIp, clientPort);
            OutputStream outputStream = socket.getOutputStream();
            outputStream = socket.getOutputStream();
            outputStream.write(msg.getBytes("GBK"));
            outputStream.flush();
            socket.shutdownOutput();

            InputStream inputStream = socket.getInputStream();
            ByteArrayOutputStream bytesOut = new ByteArrayOutputStream();
            byte[] buffer = new byte[512]; //这里最好是1024~8192之间
            int len = -1;
            while((len=inputStream.read(buffer)) != -1){
                bytesOut.write(buffer, 0, len);
            }
            String respData = bytesOut.toString("GBK");
            System.out.println("返回数据为:"+new String(respData));
            bytesOut.close();
            inputStream.close();
            outputStream.close();
            socket.close();
        } catch (UnknownHostException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
        return "";
    }
原因排查

  我知道,你们看到这段代码之后,肯定在想,这个我也试过,根本没用,但是我就说两点,看看你们当时有没有注意到:
在这里插入图片描述

1.传过去的和接收到的数据编码是否定义。
2.是否传过去的和接收到的是否为字节!字节!
大家是不是如下传的?

  传入:(字符格式并且没有编码)

OutputStream outputStream = socket.getOutputStream();
PrintWriter ps = new PrintWriter(outputStream);
 ps.write(msg); //没有编码,直接是大字符串
 ps.flush();

  接收:(字符格式并且没有编码

 InputStream inputStream = socket.getInputStream();
 BufferedReader br = new BufferedReader(new InputStreamReader(inputStream));
   String str = null;

   while ((str = br.readLine()) != null) {
       System.out.println("服务器给出的响应是:" + str);
   }

  因为我们各自对应的服务端是怎么写的,我们也不清楚,并且也不会一样,所以这两个原因也肯定不是绝对正确,反正也算是一种思路吧。
  给大家提供一个建议,遇到这种不通的情况,一定要用其他工具去尝试,如果其他工具也不行,那就直接找服务端排查他们那一端,但是如果工具没问题,就静下心来排查自己问题吧。

  • 6
    点赞
  • 30
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 9
    评论
评论 9
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

茁壮成长的凌大大

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值