关于UrlConnection连接和Socket连接的区别,只知道其中的原理如下:
抽象一点的说,Socket只是一个供上层调用的抽象接口,隐躲了传输层协议的细节。
urlconnection 基于Http协议,Http协议是应用层协议,对传输层Tcp协议进行了封装,是无状态协议,不需要你往考虑线程、同步、状态治理等,

内部是通过socket进行连接和收发数据的,不过一般在数据传输完成之后需要封闭socket连接。
直接使用Socket进行网络通讯得考虑线程治理、客户状态监控等,但是不用发送头信息等,更省流量。

并不知道我们经常使用的URLConnection 内部是怎么实现的,今天心血来潮以URL为出发点来探个究竟。
以下面这段代码为出发点
URL url = new URL("http://zhoujianghai.iteye.com");
URLConnection conecttion = (URLConnection)url.openConnection();

根据java.net.URL源码,一步步进行分析,
new URL("www.javaeye.com")会调用URL(URL context, String spec, URLStreamHandler handler),
此时context和handler是null。
url.openConnection()调用的是strmHandler.openConnection(this);
而strmHandler是URLStreamHandler接口的子类的实例。
抽象类 URLStreamHandler 是所有流协议处理程序的通用超类,可以通过不同 protocol 的 URL 实例,产生 java.net.URLConnection 对象。
由于context和handler是null,所以终极根据具体的协议调用URL类中的setupStreamHandler()方法对strmHandler进行初始化。

下面分析 setupStreamHandler()方法内的代码。

?

?

  1. String packageList = AccessController.doPrivileged(new PriviAction<String>(
  2. "java.protocol.handler.pkgs"));

?

?
首先通过java.protocol.handler.pkgs 来设置 URLStreamHandler 实现类的包路径,SUN 的 JDK 内部实现类均是在 sun.net.www.protocol. 包下。
关于sun/net/www/protocol/http包下相关类的源码,可以访问:http://www.docjar.org/docs/api/sun/net/www/protocol/http/package-index.html

PriviAction 部分源码:

  1. public PriviAction(String property) {
  2. action = GET_SYSTEM_PROPERTY;
  3. arg1 = property;
  4. }
  5. public T run() {
  6. switch (action) {
  7. case GET_SYSTEM_PROPERTY:
  8. return (T)System.getProperty((String) arg1, (String) arg2);
  9. case GET_SECURITY_PROPERTY:
  10. return (T)Security.getProperty((String) arg1);
  11. case GET_SECURITY_POLICY:
  12. return (T)Policy.getPolicy();
  13. case SET_ACCESSIBLE:
  14. ((AccessibleObject) arg1).setAccessible(true);
  15. }
  16. return null;
  17. }
  18. PriviAction<T> 实现了 java.security.PrivilegedAction<T>接口,会执行run()方法。
  19. 由action = GET_SYSTEM_PROPERTY;可知会执行代码:
  1. (T)System.getProperty((String) arg1, (String) arg2);
  1. System.getProperty方法调用成员变量Properties props的getProperty(key, def)方法;
  2. 由于并未设置任何Properties,此处会返回默认值def。def的值是null。
  3. 因此会继续执行下面的代码:
  1. String className = "org.apache.harmony.luni.internal.net.www.protocol." + protocol
  2. + ".Handler";
  3. try {
  4. strmHandler = (URLStreamHandler) Class.forName(className)
  5. .newInstance();
  6. } catch (IllegalAccessException e) {
  7. } catch (InstantiationException e) {
  8. } catch (ClassNotFoundException e) {
  9. }
  10. 此时protocol是http协议,从而根据协议 (protocol) 获得协议 URLStreamHandler 对象。
  11. 所以此时通过反射机制创建org.apache.harmony.luni.internal.net.www.protocol.http.Handler类的实例。
  12. 此时回到上面提到的 strmHandler.openConnection(this);

将调用下面的Handler类的实例的openConnection(URL u)方法。

@Override

  1. protected URLConnection openConnection(URL u) throws IOException {
  2. return new HttpURLConnectionImpl(u, getDefaultPort());
  3. }
  4. ected URLConnection openConnection(URL u, Proxy proxy)
  5. throws IOException {
  6. if (null == u || null == proxy) {
  7. throw new IllegalArgumentException(Messages.getString("luni.1B"));
  8. }
  9. return new HttpURLConnectionImpl(u, getDefaultPort(), proxy);
  10. }

此时会创建HttpURLConnectionImpl对象。HttpURLConnectionImpl是java.net.HttpURLConnection的子类。 该类有个成员变量

HttpConnection connection;这才是我们要找的,该类对Socket进行了封装。

HttpConnection 部分源码如下:

private Socket socket;

  1. private SSLSocket sslSocket;
  2. private InputStream inputStream;
  3. private OutputStream outputStream;
  4. private InputStream sslInputStream;
  5. private OutputStream sslOutputStream;
  6. private HttpConfiguration config;
  7. public HttpConnection(HttpConfiguration config, int connectTimeout) throws IOException {
  8. this.config = config;
  9. String hostName = config.getHostName();
  10. int hostPort = config.getHostPort();
  11. Proxy proxy = config.getProxy();
  12. if(proxy == null || proxy.type() == Proxy.Type.HTTP) {
  13. socket = new Socket();
  14. } else {
  15. socket = new Socket(proxy);
  16. }
  17. socket.connect(new InetSocketAddress(hostName, hostPort), connectTimeout);
  18. }
  19. 现在UrlConnection连接和Socket连接的区别应该十分清楚了吧。
  20. 使用UrlConnection比直接使用Socket要简单的多,不用关心状态和线程治理。
  21. UrlConnection基于Http协议,只是进行了封装,添加了一些额外规则(如头信息),本质上也是建立TCP连接,利用Socket
  22. 实现连接和传输数据的,不过我们一般每次请求完数据后都会实现finally方法,在该方法里封闭连接。

四周是相关类的源码。
可以往这个链接地址查找更多类的源码:
http://www.docjar.com/projects/apache-harmony-6.0-src-r917296-snapshot-code.html

UrlConnection连接和Socket连接的区别的更多相关文章

  1. TCP连接、Http连接与Socket连接

    1.TCP连接 手机能够使用联网功能是因为手机底层实现了TCP/IP协议,可以使手机终端通过无线网络建立TCP连接.TCP协议可以对上层网络提供接口,使上层网络数据的传输建立在“无差别”的网络之上. ...

  2. 比较 http连接 vs socket连接

    http连接 :短连接,客户端,服务器三次握手建立连接,服务器响应返回信息,连接关闭,一次性的socket连接:长连接,客户端,服务器三次握手建立连接不中断(通过ip地址端口号定位进程)及时通讯,客户 ...

  3. 轮询、长轮询、长连接、socket连接、WebSocket

    轮询:客户端定时向服务器发送Ajax请求,服务器接到请求后马上返回响应信息并关闭连接. 优点:后端程序编写比较容易. 缺点:请求中有大半是无用,浪费带宽和服务器资源.(而每一次的 HTTP 请求和应答 ...

  4. Http和Socket连接区别

    相信不少初学手机联网开发的朋友都想知道Http与Socket连接究竟有什么区别,希望通过自己的浅显理解能对初学者有所帮助. 1.TCP连接 要想明白Socket连接,先要明白TCP连接.手机能够使用联 ...

  5. Http、tcp、Socket连接区别

    转自Http.tcp.Socket连接区别 相信不少初学手机联网开发的朋友都想知道Http与Socket连接究竟有什么区别,希望通过自己的浅显理解能对初学者有所帮助. 1.TCP连接 要想明白Sock ...

  6. Http和Socket连接的区别

    Http和Socket连接区别 相信不少初学手机联网开发的朋友都想知道Http与Socket连接究竟有什么区别,希望通过自己的浅显理解能对初学者有所帮助. 1.TCP连接 要想明白Socket连接,先 ...

  7. socket连接和http连接的区别

    socket连接和http连接的区别 HTTP协议:简单对象访问协议,对应于应用层  ,HTTP协议是基于TCP连接的 tcp协议:    对应于传输层 ip协议:     对应于网络层 TCP/IP ...

  8. 转 Cocos网络篇[3.2](3) ——Socket连接(1)

    Cocos网络篇[3.2](3) ——Socket连接(1) 2015-03-05 22:24:13 标签:network http socket cocos [唠叨] 在客户端游戏开发中,使用HTT ...

  9. Http和Socket连接

    转自http://hi.baidu.com/%D2%B9%D1%A9%B3%E6/blog/item/d6a72d2bbf467cf2e7cd406d.html 相信不少初学手机联网开发的朋友都想知道 ...

随机推荐

  1. scrapy 登录

    说明: 本文参考了官网文档,以及stackoverflow的几个问题 注意: 下面这个爬虫不能实际运行!我只是用它来展示登录,以及之后如何处理. 方式一:FormRequest import scra ...

  2. linux内核分析 第八周

    第八周 理解进程调度时机跟踪分析进程调度与进程切换的过程 一.进程调度与切换 1.进程的调度时机与进程切换 操作系统原理中介绍了大量进程调度算法,这些算法从实现的角度看仅仅是从运行队列中选择一个新进程 ...

  3. iOS——关于创建真机调试证书(发布证书,测试(调试)证书,推送调试证书)、iOS开发者账号申请 请用开发者账号去iTunes connect 查看状态

  4. 关于ARP攻击的原理以及在Kali Linux环境下的实现

    关于ARP攻击的原理以及在Kali Linux环境下的实现 全文摘要 本文讲述内容分为两部分,前半部分讲述ARP协议及ARP攻击原理,后半部分讲述在Kali Linux环境下如何实现ARP攻击以及AR ...

  5. css为什么要用悬浮

    如果这个100px的宽度是一个Img,横内元素.右边也是横内元素的话和块级元素是不同的. 2.文字环绕图片. div下有个img然后有个span标签 img最好悬浮,悬浮虽然说脱离文档,但是还是占空间 ...

  6. ARP 命令运行实现静态IP/MAC绑定

    公司网络出现本地无法连接,以前公司是分配的固定IP,结果还是无法连接网络,后来网管帮我设置了下,我也学习了下.解决办法如下: 1.首先以管理员身份运行CMD打开命令行程序 开始-程序-附件-命令提示符 ...

  7. Coding the Matrix (3):矩阵

    1. 矩阵与映射 矩阵和映射包含两方面的关系: 简单:已知矩阵 M, 从向量 x 映射到 M * x. (注:矩阵与行向量的点乘) 稍微复杂:已知映射 x ->M * x, 求矩阵 M. 第一种 ...

  8. 第三十九课:requestAnimationFrame详解

    大家应该都知道,如果一个页面运行的定时器很多,无论你怎么优化,最后肯定会超过指定时间才能完成动画.定时器越多,延时越严重. 为此,YUI,kissy等采用中央队列的方式,将定时器减少至一个.浏览器厂商 ...

  9. MVC——应用Ajax获取不到数据问题解答

    当我们使用控制器利用Ajax获取表单数据时,调试为null,这时看看你接受表单时定义的参数名字是否为action 其实不能起这个名字的,这个名字和控制器关键字冲突了 随便换个其它名字就好了,比如我起个 ...

  10. 调研Android平台开发环境的发展演变

    Android是Google推出的开源手机操作系统,主要以开发应用为主,要进行Android开发首先得搭建好开发平台.最近在搭建Android的开发环境,发现往往一个小问题都能花费你大半天时间,从刚开 ...