Http请求超时的一种处理方法
2015-09-07 21:17
776 查看
URLConnection类常见的超时处理就是调用其setConnectTimeout和setReadTimeout方法:
setConnectTimeout:设置连接主机超时(单位:毫秒)
setReadTimeout:设置从主机读取数据超时(单位:毫秒)
还有一种比较另类的就是利用java Object对象的wait()和notify()、notifyAll()方法,利用线程的等待和通知机制处理urlConnection的超时,下面直接贴代码:
setConnectTimeout:设置连接主机超时(单位:毫秒)
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(); } }
相关文章推荐
- 关于淘宝橱窗推荐-->用户行为追踪--http协议深入
- tcp的Nagle算法
- 网络编程之socket、epoll
- TCP四种定时器
- java下tcp的socket连接
- HTTP响应报文与工作原理详解(转)
- 记录一个查询颜色RGB和HSV值还有HTTP状态码等的网站
- ab源码分析 (2013-07-12 13:00:06) http://blog.sina.com.cn/s/blog_999d1f4c0101e18f.html
- apache ab 输出结果详细解析(源码分析) http://my.oschina.net/lubia/blog/177186
- Cocos2dx引擎笔记——HttpClient session
- TestUrlHttpConnection
- TCP/IP,http,socket,长连接,短连接——小结。
- Cocos2dx引擎笔记——如何使用HttpClient
- 快速Android开发系列网络篇之Retrofit, Retrofit OKHttp GSON
- CentOS下使用tcpdump网络抓包用
- linux安装apache的纠结过程 http://www.cnblogs.com/fnng/archive/2012/08/30/2662984.html
- TCP标志位之RST
- 网络编程
- ioS开发之网络--网络基础概况
- iOS开发之网络--服务器配置