代码改变世界

URLConnection的学习笔记

2011-03-21 17:07  shy.ang  阅读(20246)  评论(1编辑  收藏  举报

    作为一个初学者,我是在学习Android网络编程的时候遇到的URLConnection,在网上也看见了不少代码,发现他们写的都不一样,或多或少(除了转载),也有很多提问和回答的,自己从中也吸取了一些知识,再加上自己的理解和调试,得出了一些东西,整理一下吧。

  对于Android的初学者,在网络编程的时候,一定不要忘记<uses-permission android:name="android.permission.INTERNET"></uses-permission>,我在这上面吃了两次亏,比较郁闷,希望大家尤其是初学者千万不要忘记!不添加的话,貌似由对应程序调出的Andorid模拟器会显示网络没有信号,即上不去网。

  关于URLConnection,网上很多回答都是对API的翻译,很崩溃,我是看了很多之后,然后看API才发现的。此后我会吸取教训,一遇到问题首先看API,也建议大家这样,英文的最好,不是太相信那些翻译的,呵呵,感觉还是自己斟酌理解的好吧。下面我就解读一下URLConnection的API,虽然也是一种翻译,但是结合我自己的理解,还有一点亲自调试得出的结论。

  URLConnection是所有表示应用程序与URL之间通信连接的类的父类(super class),该类的实例可以用来对由URL引用的资源进行读取和写入操作。

  HttpURLConnection 是支持HTTP特定功能的URLConnection,还有JarConnection是URLConnection的直接子类。

  创建URLConnection对象主要要经历两步:

      第一步是creat:URLConnection conn = url.openConnection();

      第二步是connect:conn.connect();//这两个是不同的,见下面调试

       在created和connected之间可以设置一些变量选项(如setDoInput,超时等),而如果connect之后再设置就会引发异常(网上也有这个问题)

      在需要连接才能执行的操作(如getInputStream等应用层操作),程序会暗中(implicitly)执行连接

      一旦连接可用,就可以访问获取资源,如执行getInputStream()等,对于HttpURLConnection,还有conn.getResponseCode()==200来判定服务器是否返回正确的应答码以表明请求被接受。

  

  在URLConnection中,有一个域boolean connected ,值为true表明已经建立到指定URL的连接;false则没有(华丽的标记)

  connect()    当连接还未被建立时,打开一个communications link,而如果这个链接已经被打开(connected值设置为true)则 ignore it 。

  下面编了一个小程序进行调试:

 

URL url = new URL("http://www.google.cn");
URLConnection conn
= url.openConnection();
conn.setConnectTimeout(
10000);
conn.connect();
InputStream inStream
= conn.getInputStream();

当程序执行完openConnection()之后,域connected值还是false,说明这时候还未连接。等执行到connect()之后,connected才变为true,说明这时候才完成连接。而当我注释掉connect()后,再运行程序,connected值到getInputStream执行完又变为true,这时候知道getInputStream会使连接暗中被执行。

  综上,对于一般需要连接才执行的操作(可能也有不需要连接的操作吧~~),connect()是可以省略的。但是只有在connect()执行完,连接才正式建立,而不是openConnection(只是创建了一个连接对象)

  (后记)可以利用ByteArrayOutputStream将输入流写入内存:

ByteArrayOutputStream outstream=new ByteArrayOutputStream();
byte[] buffer=new byte[1024];
int len=-1;
while((len=inStream.read(buffer)) !=-1){
outstream.write(buffer,
0, len);
}
outstream.close();
inStream.close();