zoukankan      html  css  js  c++  java
  • Http请求超时的一种处理方法

    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(); } }
  • 相关阅读:
    关于第三方库
    一些css属性,抄自某个大神忘记谁了,不好意思
    10.使用express模拟数据服务器
    9.text-shadow
    8.css背景图案
    7.一个抄来圆形菜单
    6.文字闪烁效果
    5.偶然看到的一个css加载动画
    4.怎样使用css实现一个切角效果
    3.写一个简单的弹出菜单
  • 原文地址:https://www.cnblogs.com/gdguansun/p/4789982.html
Copyright © 2011-2022 走看看