Http请求超时的一种处理方法[通俗易懂]

Http请求超时的一种处理方法[通俗易懂]URLConnection类常见的超时处理就是调用其setConnectTimeout和setReadTimeout方法:setConnectTimeout:设置连接主机超时(单位:毫秒)setRea

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。

Jetbrains全系列IDE使用 1年只要46元 售后保障 童叟无欺

URLConnection类常见的超时处理就是调用其setConnectTimeout和setReadTimeout方法:

  1. setConnectTimeout:设置连接主机超时(单位:毫秒)  
  2. setReadTimeout:设置从主机读取数据超时(单位:毫秒)

还有一种比较另类的就是利用java Object对象的wait()和notify()、notifyAll()方法,利用线程的等待和通知机制处理urlConnection的超时,下面直接贴代码:

public class HttpConnProcessThread implements Runnable {

    public boolean isStop = false;

    public boolean readOK = false;

    private HttpURLConnection reqConnection = null;
    
    public Thread readingThread;

    private int readLen;

    private String msg = null;
        
    private String reqMethod;

    private byte[] data;
    
    /**
     * ReadThread constructor comment.
     */
    public HttpConnProcessThread(HttpURLConnection reqConnection, String msg, String reqMethod ) {
        super();
        this.reqConnection = reqConnection;
        this.msg = msg;
        this.reqMethod = reqMethod;
    }

    public void run() {

        InputStream input = null;
        OutputStream output = null;

        try{
            //reqConnection.connect();
            output = reqConnection.getOutputStream();
            if ("post".equalsIgnoreCase(reqMethod) && msg != null && msg.length() >0) 
            {
                output.write(msg.getBytes());
                output.close();
                output = null;
            }

            // 处理HTTP响应的返回状态信息
            int responseCode = reqConnection.getResponseCode();// 响应的代码if( responseCode != 200 )
                System.out.println("connect failed! responseCode = " + responseCode + " msg=" + reqConnection.getResponseMessage());
            
            input = reqConnection.getInputStream();

            int len;
            byte[] buf = new byte[2048];
            readLen = 0;
            ByteArrayOutputStream outStream = new ByteArrayOutputStream();  
       // 读取inputStream
            while (!isStop) 
            {
                len = input.read(buf);
                if (len <= 0) 
                {
                    this.readOK = true;
                    input.close();
                    data=outStream.toByteArray();
                    break;
                }
                outStream.write(buf, 0, len);  
                readLen += len;
            }
        }
        catch( IOException ie)
        {}
        catch(Exception e)
        {}
        finally
        {
            try{
                reqConnection.disconnect();
                if( input != null )
                    input.close();
                if( output != null )
                    output.close();
                
                //唤醒线程,跳出等待
                wakeUp();
            }catch(Exception e)
            {
                
            }
        }
    }

    public String getMessage(){
        if (!readOK) //超时
        {
            return "";
        }
        
        if (readLen <= 0) {
            return "";
        }
        return new String(data, 0, readLen);
    }

    public void startUp() {
        this.readingThread = new Thread(this);
        readingThread.start();
    }


    //唤醒线程,不再等待
    private synchronized void wakeUp() {
        notifyAll();
    }

    public synchronized void waitForData(int timeout) 
    {
        try {
            //指定超时时间,等待connection响应
            wait(timeout);
        } 
        catch (Exception e) 
        {
        }
            
        if (!readOK)
        {
            isStop = true;
            try{
                //中断线程
                if( readingThread.isAlive() )
                    readingThread.interrupt();
            }catch(Exception e)
            {
                
            }
        }
    }

    public static main(String[] args){
        String msg="";
        URL reqUrl = new URL("http://127.0.0.1:8080/");

        // 建立URLConnection连接
        reqConnection = (HttpURLConnection) reqUrl.openConnection();
        HttpConnProcessThread rec = new HttpConnProcessThread(reqConnection, msg, "post" );
        rec.startUp();
   // 如果顺利连接到并读完数据,则跳出等待,否则等待超时 rec.waitForData(
2000); String retMessage = rec.getMessage(); } }

 

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/167426.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 很有趣的Java分形绘制

    部分与整体以某种形式相似的形,称为分形。首先我们举个例子:我们可以看到西兰花一小簇是整个花簇的一个分支,而在不同尺度下它们具有自相似的外形。换句话说,较小的分支通过放大适当的比例后可以得到一个与整体

    2021年12月20日
    58
  • Cap04_项目整体管理[通俗易懂]

    Cap04_项目整体管理[通俗易懂]Cap04_项目整体管理

    2022年4月20日
    52
  • 企业社交,阿里钉钉向左,企业微信向右

    企业社交,阿里钉钉向左,企业微信向右在企业社交领域里,阿里钉钉和企业微信这两大巨头,正在各自轨道上加速突进,以不同的模式在企业级服务市场引发深刻变化。进击的阿里钉钉截止到2018年底,阿里钉钉上的企业组织达到了700万家以上,也就是说钉钉已经实现了对16%中国企业的覆盖。但进击的钉钉并不满足于此,它在两个方向上发起了新的挑战:一是在巩固原有中小企业市场的基础上,开始向大企业市场延伸;并以全链路数字化办公解决方案为基础,将钉钉从“…

    2022年5月14日
    48
  • 数据仓库之电商数仓– 3.1、电商数据仓库系统(ODS层、DIM层、DWD层)

    数据仓库之电商数仓– 3.1、电商数据仓库系统(ODS层、DIM层、DWD层)目录一、数仓分层1.1为什么要分层1.2数据集市与数据仓库概念1.3数仓命名规范1.3.1表命名1.3.2脚本命名1.3.3表字段类型二、数仓理论2.1范式理论2.1.1范式概念2.1.2函数依赖2.1.3三范式区分2.2关系建模与维度建模2.2.1关系建模2.2.2维度建模⭐️2.3维度表和事实表⭐️2.3.1维度表2.3.2事实表2.4维度模型分类2.5数据仓库建模⭐️????2.5.1ODS层2.5.2DIM层和DWD层2.5.3DWS层与DWT层2.5.4

    2022年6月26日
    28
  • windows安装mysql connector/python

    windows安装mysql connector/python参考链接

    2022年7月15日
    16
  • 使用jdbc连接mysql数据库_mysql允许远程连接

    使用jdbc连接mysql数据库_mysql允许远程连接JDBC(JavaDatabaseConnectivity,Java数据库连接)是Java语言中用来规范客户端程序如何来访问数据库的应用程序接口,提供了诸如查询和更新数据库中数据的方法。本文讲述如何使用JDBC来连接和访问数据库。为方便引入JDBC依赖包,我们创建Maven项目来实现我们的示例程序。打开IntelliJIDEA客户端,File-New-…

    2025年9月6日
    8

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号