对URL,URLConection的源码的分析

客户端链接网络获取数据一般使用URL类

URL ulr = new URL(" ");

URLConnection connection = url.openConnection();-------------该方法返回的是一个URLConnection对象

 connection.getInputStream()--------------------链接网络并获取数据

具体是怎么链接到网络服务器的呢

下面进入openConnection()方法中

从源码知道,这个方法教给了URLStreamHandler handler;处理 器去实现

 

下一步点击进入handler.openConnetion()发现该方法是一个抽象方法,具体实现交给了子类

 

我们在idea中查看该处理器的结构

 

下一步是找handler.openConnetion()方法的具体实现,我们点进

发现最终调用实现的是new HttpURLConnection();这个新建对象返回URLConnection.....那么我们可以想是否在这个对象进行初始化的时候就进行一些类似Socket的链接呢,

我们不着急,我们先看URLConnection这个类

 

我们在idea在URLConnection这个类名字按快捷键ctrl + h查看类的结构

如图

 

URLConnection是一个抽象父类,我们发现刚才调用new HttpURLConnection()的方法中的所属于的类是这个的子类,那么我顺势进入HttpURLConnection这个类的构造方法好了

用过查看源码并没有发现类似soket的链接

但是我们还有connection.getInputstream()方法还没有看

该方法在抽象父类的默认实现是抛出异常的,那么我们直接看子类对该方法的覆盖就可以了

下面是HttpConnection的getInputstream()的实现

我们可以看到最终调用的是getInputStream0()方法

 

 

其中我们只要关注的就是this.connect()方法就可以了,其余的可以省略....

 

嗯..又在调用其他方法..那我们继续点进去就可以了

 在plainConnect0()的源码

我们可以不用关注这些,我们可以看到最终有用的下面这个

 

 

调用this.getNewHttpClient()方法...

然后在HttpClient.New() 方法中最重要的也就是

new HttlClient();

 

因为这个方法中做了我们一直想看的事情!!!

 

 

 

看到最后面的openServer()!!!!!重点来了

然后就是把重点放在doConnect()方法

来了,划重点!!!!!!

 

 没错就这样链接上了.................................严谨

 

 

第一次写分析源码,思路不是很清晰,请见谅,有错大家可以指出来交流交流,谢谢大家

 

posted @ 2017-11-17 11:50  孤寂繁星  阅读(463)  评论(0)    收藏  举报