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

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

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

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

1.tcp工具发送成功

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

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 "";
    }

原因排查

  我知道,你们看到这段代码之后,肯定在想,这个我也试过,根本没用,但是我就说两点,看看你们当时有没有注意到:
针对java.net.SocketException: Connection reset的问题排查_第2张图片

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);
   }

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

你可能感兴趣的:(java,后端)