你的位置:首页 > Java教程

[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(); }}