import java.io.*;
import java.net.HttpURLConnection;
import java.net.URL;
/**
* @author paul
* @description
* @date 2018/10/25
*/
public class Test {
public static void main(String[] args) {
//{1}
// 请求不存在的域名,结果有两种
// java.net.UnknownHostException: www.321123google321123.com (dns拒绝)
// java.net.ConnectException: Connection timed out: connect (21秒超时) //原因服务器三次握手第二步服务器不响应
//postHtml("http://www.321123google321123.com/hello","hello world");
//{2}
//java.net.ConnectException: Connection refused: connect //原因三次握手第二步服务端返回 RST ACK(可能数据包含拒绝)
//postHtml("http://75.126.124.162/hello","hello world");
//{3}
//请求存在域名,但被运营商拦截 conn.setReadTimeout(5000);
//java.net.ConnectException: Connection refused: connect 原因类似于{2}
//postHtml("http://www.google.com/hello","hello world");
//{4}
//请求存在域名,但被运营商拦截 conn.setReadTimeout(5000);conn.setConnectTimeout(5000);
//java.net.SocketTimeoutException: connect timed out 原因:conn.setConnectTimeout(5000);
//postHtml("http://www.google.com/hello","hello world");
//{5}
//请求本地不存在的服务
//java.net.ConnectException: Connection refused: connect //原因三次握手第二步服务端返回 RST ACK(可能数据包含拒绝)
//postHtml("http://127.0.0.1:22223/hello","hello world");
//{6}
//客户端设置:conn.setConnectTimeout(5000);conn.setReadTimeout(5000);
//连接成功,服务端hold住,客户端报错,但是可能服务端已经收到数据进行处理了
//客户端:java.net.SocketTimeoutException: Read timed out 原因:conn.setReadTimeout(5000);
//postHtml("http://127.0.0.1:22222/hello","hello world");
//{7}
//客户端设置:conn.setConnectTimeout(5000);
//连接成功,服务端hold住,客户端死等
//postHtml("http://127.0.0.1:22222/hello","hello world");//
//{8}
//服务器:10.143.69.60 端口90 防火墙规则DROP(未设置ConnectTimeout 客户端21秒后超时,依赖于操作系统)
//java.net.ConnectException: Connection timed out: connect 原因服务器三次握手第二步服务器不响应
//postHtml("http://127.0.0.1:90/ls",null);
//{9}
//服务器:10.143.69.60 端口91 防火墙规则REJECT(未设置ConnectTimeout 客户端21秒后超时,依赖于操作系统)
//java.net.ConnectException: Connection timed out: connect 原因服务器三次握手第二步服务器返回icmp port不可达,但客户端无法解析icmp包
//postHtml("http://127.0.0.1:91/ls",null);
//{10}
//服务器:10.143.69.60 端口92 ACCECT但没有对应监听服务 (直接失败)
// java.net.ConnectException: Connection refused: connect
//postHtml("http://127.0.0.1:92/ls",null);
//总结
//客户端断网:java.net.SocketException: Network is unreachable: connect
//客户端设置连接超时:java.net.SocketTimeoutException: connect timed out
//客户端设置读取超时:java.net.SocketTimeoutException: Read timed out
//服务端拒绝连接(可能原因服务端口允许,但没有监听应用停止,三次握手第二步RST ACK返回):java.net.ConnectException: Connection refused: connect
//服务端拒绝连接(可能原因防火墙DROP,REJECT,客户端没有收到三次握手第二步服务端的反应,客户端window默认21秒超时):java.net.ConnectException: Connection timed out: connect
//IOException 当发生 I/O 错误时会产生 IOException 异常
// 磁盘损坏;
// 实际上读的是远程文件、可移动介质,当资源不可用时,会产生异常;
// 系统内部原因,如读取缓冲区占满、其他程序也在读写,导致读写超时;
//postHtml("http://127.0.0.1:22222/ls",null);
}
public static String postHtml(String url, String postData) {
long start = 0;
try {
start = System.currentTimeMillis();
URL obj = new URL(url);
HttpURLConnection conn = (HttpURLConnection) obj.openConnection();
//conn.setConnectTimeout(-1);
//conn.connect();
//conn.setReadTimeout(5000);
conn.setRequestMethod("POST");
conn.setDoOutput(true);
conn.setDoInput(true);
OutputStream outputStream = conn.getOutputStream();
if (postData == null) {
PrintWriter out = new PrintWriter(outputStream);
out.print(postData);
out.flush();
}
BufferedReader br = new BufferedReader(new InputStreamReader(
conn.getInputStream(), "UTF-8"));
StringBuffer response = new StringBuffer();
String line;
while ((line = br.readLine()) != null) {
response.append(line);
}
br.close();
return response.toString();
} catch (Exception e) {
long l = System.currentTimeMillis() - start;
System.out.println("默认超时时间:" + l);
e.printStackTrace();
return "";
}
}
}
网友评论