Java网络编程实践和总结 --- URLConnection的学习

来源:互联网 发布:池州学院大数据学院 编辑:程序博客网 时间:2024/05/29 08:13


前面的blog主要讲解了Java基于TCP/UDP的Socket编程,这些实现都是基于TCP/IP协议上实现的,现在将学习用于和服务器(尤其是HTTP服务器)交互的Java网络接口:URLConnection类。

如果使用Socket接口直接和HTTP服务器交互,在信息传输过程中涉及到HTTP协议的信息头是不会被封装和处理的。Socket只会对TCP/IP协议的包头进行封包和解包。因此Java就提供了URLConnection类来处理这一类的连接,该类具有java的协议处理器机制,即:将处理协议的细节从处理特定的数据类型中分离出来,提供相应的用于接口,并进行其他完整的Web浏览器所完成的操作。


以下为使用URLConnection类的基本步骤:

1.构造一个URL对象

2.调用URL对象的openConnection()方法来获取一个与该URL对应的URLConnection对象

3.配置URLConnection的信息

4.读取首部的字段

5.获取输入流读取数据

6.获取输出流写入数据

7.关闭连接


以下为获取一个URLConnection的基本步骤:

<span style="white-space:pre"></span>try {URL u = new URL("http://www.baidu.com");URLConnection uc = u.openConnection();} catch (MalformedURLException e) {e.printStackTrace();} catch (IOException e) {e.printStackTrace();}

可以通过URLConnection的getInputStream()来获取网页的信息:

<span style="white-space:pre"></span>BufferedInputStream bis = null;try {URL u = new URL("http://www.baidu.com");URLConnection uc = u.openConnection();bis = new BufferedInputStream(uc.getInputStream());int len = -1;byte[] buf = new byte[2048];while ((len = bis.read(buf)) != -1) {System.out.print(new String(buf, 0, len));}} catch (MalformedURLException e) {e.printStackTrace();} catch (IOException e) {e.printStackTrace();}


URLConnection类一般用来获取HTTP服务器在每个相应的首部中添加的大量信息,以下为一个典型HTTP服务器返回的首部信息:

    1. HTTP/1.1 200 OK
    2. Server: bfe/1.0.8.1Date: Thu, 02 Apr 2015 14:39:27 GMT
    3. Content-Type: text/javascript; charset=gbk
    4. Content-Length: 353
    5. Connection: keep-alive
    6. Cache-Control: privateExpires: Thu, 02 Apr 2015 15:39:27 GMT
    7. Content-Encoding: gzip
URLConnection类提供了6个方法获取常见的6个字段:

getContentType():获取MIME内容类型,对应首部信息Content-type字段

getContentLength() :获取文件的长度,用于表示二进制文件的字节数,对应字段Content-length字段

getContentEncoding():获取内容编码,对应字段Content-encoding字段

getDate():获取文件何时发送的,对应Date字段

getExpiration():获取基于服务器的过期日期,说明何时从缓存中删除文档,对应Expires字段

getLastMoified():获取最后修改时间,对应Last-modified字段

另外,HTTP的其他首部信息可以通过getHeaderFied(String name)任意获取,有关HTTP协议详细信息请参考相关资料以及参考JDK API文档。


接下来我们将使用以上API打印一个HTTP首部信息:

<span style="white-space:pre"></span>try {URL u = new URL("http://www.baidu.com");URLConnection uc = u.openConnection();System.out.println("Content-type:" + uc.getContentType());System.out.println("Content-length:" + uc.getContentLength());System.out.println("Content-encoding:" + uc.getContentEncoding());System.out.println("Date:" + new Date(uc.getDate()));System.out.println("Expires:" + new Date(uc.getExpiration()));System.out.println("Last-modified:" + new Date(uc.getLastModified()));} catch (MalformedURLException e) {e.printStackTrace();} catch (IOException e) {e.printStackTrace();}

运行结果:

Content-type:text/html; charset=utf-8
Content-length:-1
Content-encoding:null
Date:Thu Apr 02 22:56:30 CST 2015
Expires:Thu Apr 02 22:56:04 CST 2015
Last-modified:Thu Jan 01 08:00:00 CST 1970


通过getHeaderFied来遍历所有首部信息:

<span style="white-space:pre"></span>try {URL u = new URL("http://www.baidu.com");URLConnection uc = u.openConnection();for (int i = 1; ;i++) {String value = uc.getHeaderField(i);if (null == value) continue;System.out.println(uc.getHeaderFieldKey(i) + " : " + value);}} catch (MalformedURLException e) {e.printStackTrace();} catch (IOException e) {e.printStackTrace();}
运行结果:

Date : Thu, 02 Apr 2015 15:05:40 GMT
Content-Type : text/html; charset=utf-8
Transfer-Encoding : chunked
Connection : Keep-Alive
Vary : Accept-Encoding
Set-Cookie : BAIDUID=480666D89E54D584C2D0A76917C89A24:FG=1; expires=Thu, 31-Dec-37 23:55:55 GMT; max-age=2147483647; path=/; domain=.baidu.com
Set-Cookie : BIDUPSID=480666D89E54D584C2D0A76917C89A24; expires=Thu, 31-Dec-37 23:55:55 GMT; max-age=2147483647; path=/; domain=.baidu.com
Set-Cookie : BDSVRTM=0; path=/
Set-Cookie : BD_HOME=0; path=/
Set-Cookie : H_PS_PSSID=1449_12677_13075_10902_10211_12868_13322_12691_8502_13348_12722_12736_13227_13325_13203_13161_13257_8498_10633; path=/; domain=.baidu.com
P3P : CP=" OTI DSP COR IVA OUR IND COM "
Cache-Control : private
Cxy_all : baidu+dcbbc7c45fc20aa09337768919da4ecf
Expires : Thu, 02 Apr 2015 15:04:50 GMT
X-Powered-By : HPHP
Server : BWS/1.1
BDPAGETYPE : 1
BDQID : 0x845db58200012859
BDUSERID : 0





0 0
原创粉丝点击