原文链接:
http://www.blogjava.net/supercrsky/articles/247449.html
http://blog.csdn.net/woxueliuyun/article/details/43267365
任何网络连接都需要经过socket才能连接,HttpURLConnection不需要设置socket,所以,HttpURLConnection并不是底层的连接,而是在底层连接上的一个请求。这就是为什么HttpURLConneciton只是一个抽象类,自身不能被实例化的原因。HttpURLConnection只能通过URL.openConnection()方法创建具体的实例。
虽然底层的网络连接可以被多个HttpURLConnection实例共享,但每一个HttpURLConnection实例只能发送一个请求。请求结束之后,应该调用HttpURLConnection实例的InputStream或OutputStream的close()方法以释放请求的网络资源,不过这种方式对于持久化连接没用。对于持久化连接,得用disconnect()方法关闭底层连接的socket。
一、创建HttpURLConnection
1 | URL url = new URL("http://localhost:8080/xxx.do"); |
二、设置HttpURLConnection参数
若为Get请求,不用设置下述参数,只需要最后一步的connect()即可
1 | // 设定请求的方法为"POST",默认是GET |
三、URLConnection建立连接
1 | // 此处getOutputStream会隐含的进行connect(即:如同调用上面的connect()方法, |
四、HttpURLConnection发送请求
1 | // 现在通过输出流对象构建对象输出流对象,以实现输出可序列化的对象。 |
五、HttpURLConneciton获取响应
1 | // 调用HttpURLConnection连接对象的getInputStream()函数 |
六、设置POST参数
1 | OutputStream os = httpConn.getOutputStream(); |
超时设置,防止网络异常的情况下,可能会导致程序僵死而不继续往下执行
1 | System.setProperty("sun.net.client.defaultConnectTimeout", "30000"); |
其中:sun.net.client.defaultConnectTimeout
:连接主机的超时时间(单位:毫秒)sun.net.client.defaultReadTimeout
:从主机读取数据的超时时间(单位:毫秒)
JDK 1.5以前的版本,只能通过设置这两个系统属性来控制网络超时。在1.5中,还可以使用HttpURLConnection的父类URLConnection的以下两个方法:
setConnectTimeout
:设置连接主机超时(单位:毫秒)setReadTimeout
:设置从主机读取数据超时(单位:毫秒)
1 | HttpURLConnection urlCon = (HttpURLConnection)url.openConnection(); |