美文网首页
HttpURLConnection异常说明

HttpURLConnection异常说明

作者: 全都是泡沫啦 | 来源:发表于2018-10-26 09:34 被阅读0次
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 "";
        }
    }
}

相关文章

网友评论

      本文标题:HttpURLConnection异常说明

      本文链接:https://www.haomeiwen.com/subject/cqfktqtx.html