刚刚看了三个小时的主播,精力恢复了50%,发现原来主播这个职业还是有他存在的道理的,前提是播主与观众都具有一定的理智以及职业道德,或者说成人的自觉意识。 遂趁着这个时间整理一下android的网络编程的知识,不至于晚上的所有时间都荒废。
首先需要明确的是,android通常都是通过http协议与网络交互。 因此网上众多的资源都是关于一些http协议的使用规范以及要求。 如果我没记错的话,之前在看java源码的过程中,有看到关于HttpConection源码的部分, 可以发现他要依赖于Socket实现。 Socket是java中用于网络操作的抽象,它最终的实现通过依赖操作系统完成。 具有Tcp,与 udp两种协议。 回顾一下我们学习的Tcp/Ip网络模型,物理层->数据链路层->网络层->运输层->应用层。 那么可以知道Socket是关于运输层的一个抽象,http是应用层协议的一个抽象,它是以运输层为基础的。 并且,好像c语言也有个socket的概念,也是运输层协议的抽象。 要联网别无他法,因为如今的互联网是基于tcp/ip协议的,它们最终的物理实现都要落实到网络适配器上,也就是网卡。 而驱动它的应该就是socket。 所以socket编程,应该就是网络编程,但是网络编程,可能还包括一些其它的局域的协议。
所以从这个意义理解,将android网络编程 就直接去学习一通 http协议的用法规范,感觉是有那么一些些欠妥。。
扯远了,继续正文整理:
网络编程核心类之HttpURLConnection:
从它的名称看,必然是与http连接相关的。
既然是学习这个类,那么不去看它的构成自然算不上学习过,所以便看看它的结构以及主要的方法等。
在查找时,能发现一个有趣的现象,android官方包带有这个包了,但是java的核心rt包也在这里。 这不禁引起思考,当我们在类中引入了这个类,由于它们的包名是一致的,那么最后加载哪个呢???? 因为一般情况下我们在开发java的时候,如果我们手动定义一个 java.lang.String类的话,加载的时候会出错。 这是因为Java的 类加载器使用了双亲委派机制, 用户定义的java.lang.String包会被类加载器识别为以被BootClassLoader加载,但是它当它被实例化的时候,会实例系统的那个String,最终会导致异常,类型不匹配,且无法强转的错误。 所以,这里的问题与刚刚的问题看起来是差不多的。 但是我们发现程序跑起来的时候并不会报错。 有几种可能性:一就是android的类加载机制不一样,具体是怎样的有空了可以查一查; 二就是,由于这两个包都是以依赖的方式存在的,它们是以同一个类加载负责的,至于加载到哪个,就看哪个在前面。实例化的时候并不影响,因为它们类型是完全相同的所以不会出错。
此外,从这个类的关系可以看出,与其说是android的网络编程,不如说是java的网络编程。
这里需注意,在没有中间的方法转化的情况,所有的方法都是大写形式的。
socket的权限支持。
可以看到很多的操作都与connected属性相关,可以查看代码发现,它是URLConnection提供的一个属性,为public属性。
它的一个核心方法有: getResponseCode ----> 从响应头中取响应码,至于响应头的设置方法则没有直接在源码中找到。 可能是其它的机制。
android网络编程之httpClient:
由于已经被官方废弃,就简单看看:
发现并没有在android的官方中发现这个类。 此外,也没有被废弃。
此外,它位于sun包,位于这个包下的内容重要性不言而喻了,很多都是最接近native的类。
鉴于室友已经休息了,就不继续整理了,明天接着整理下数据格式的处理就O了。