关于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. MemCached配置与缓存知识概述

    先看看百度百科里面对缓存的介绍: 缓存(Cache memory)是硬盘控制器上的一块内存芯片,具有极快的存取速度,它是硬盘内部存储和外界接口之间的缓冲器.由于硬盘的内部数据传输速度和外界介面传输速度 ...

  2. 面试准备(二) 绘制 Activity 的生命流程图

    我们来看一下这一张经典的生命周期流程图: 相信不少朋友也已经看过这个流程图了,也基本了解了Activity生命周期的几个过程,我们就来说一说这几个过程. 1.启动Activity:系统会先调用onCr ...

  3. Myeclipse其实和Eclipse差不多的, 至少不输出来的项目时一模一样的

    http://zhidao.baidu.com/link?url=LiaDdzRYJtarYvpL_co-Zgno31Az7QiS0VFxGm351K3gWa225oU6-NFEfkalJB3lGV6 ...

  4. 腾讯的一个移动端测试小工具GT

    上周末参加了Ministar北京的测试聚会.腾讯的MIG专项测试组的组长给大家介绍了他们最近开发出来的手机测试工具GT. 下面是GT的官方说明: GT(随身调)是APP的随身调测平台,它是直接运行在手 ...

  5. 20145215《Java程序设计》第9周学习总结

    20145215<Java程序设计>第九周学习总结 教材学习内容总结 整合数据库 JDBC入门 JDBC是用于执行SQL的解决方案,开发人员使用JDBC的标准接口,数据库厂商则对接口进行操 ...

  6. 云计算之路-阿里云上:2014年6月11日17点遇到的CPU 100%状况

    今天下午17:00-17:05之间,在请求量没有明显变化的情况下,SLB中的1台云服务器的CPU突然串到100%(当时SLB中一共有3台云服务器),见下图: 造成的直接后果是请求执行时间变得超长,最长 ...

  7. CoffeeScript及相关文本标记语言

    粗步看了下CoffeeScript(简称cs),发现cs这玩意还是有些问题,当然最大的问题之一是缺乏称手的工具.要是能放VS里编译调试当然好.但是转来转去的,真不如直接多敲几个JS字符串. 问题之二就 ...

  8. Visual Studio调试

    一:C# CODING 技巧 1:TODO 然后 CTRL + W + T,打开任务列表,选中 Comments,就会显示所有待做的任务 2:打开所在的文件夹 右键单击任何一个文件选项卡, 选择&qu ...

  9. [bzoj1296][SCOI2009]粉刷匠(泛化背包)

    http://www.lydsy.com:808/JudgeOnline/problem.php?id=1296 分析: 首先预处理出每一行的g[0..T]表示这一行刷0..T次,最多得到的正确格子数 ...

  10. Codeforces Round #381 (Div. 2) D. Alyona and a tree 树上二分+前缀和思想

    题目链接: http://codeforces.com/contest/740/problem/D D. Alyona and a tree time limit per test2 secondsm ...