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