UrlConnection连接和Socket连接的区别
关于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()方法内的代码。
?
?
- String packageList = AccessController.doPrivileged(new PriviAction<String>(
- "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 部分源码:
- public PriviAction(String property) {
- action = GET_SYSTEM_PROPERTY;
- arg1 = property;
- }
- public T run() {
- switch (action) {
- case GET_SYSTEM_PROPERTY:
- return (T)System.getProperty((String) arg1, (String) arg2);
- case GET_SECURITY_PROPERTY:
- return (T)Security.getProperty((String) arg1);
- case GET_SECURITY_POLICY:
- return (T)Policy.getPolicy();
- case SET_ACCESSIBLE:
- ((AccessibleObject) arg1).setAccessible(true);
- }
- return null;
- }
- PriviAction<T> 实现了 java.security.PrivilegedAction<T>接口,会执行run()方法。
- 由action = GET_SYSTEM_PROPERTY;可知会执行代码:
- (T)System.getProperty((String) arg1, (String) arg2);
- System.getProperty方法调用成员变量Properties props的getProperty(key, def)方法;
- 由于并未设置任何Properties,此处会返回默认值def。def的值是null。
- 因此会继续执行下面的代码:
- String className = "org.apache.harmony.luni.internal.net.www.protocol." + protocol
- + ".Handler";
- try {
- strmHandler = (URLStreamHandler) Class.forName(className)
- .newInstance();
- } catch (IllegalAccessException e) {
- } catch (InstantiationException e) {
- } catch (ClassNotFoundException e) {
- }
- 此时protocol是http协议,从而根据协议 (protocol) 获得协议 URLStreamHandler 对象。
- 所以此时通过反射机制创建org.apache.harmony.luni.internal.net.www.protocol.http.Handler类的实例。
- 此时回到上面提到的 strmHandler.openConnection(this);
将调用下面的Handler类的实例的openConnection(URL u)方法。
- protected URLConnection openConnection(URL u) throws IOException {
- return new HttpURLConnectionImpl(u, getDefaultPort());
- }
- ected URLConnection openConnection(URL u, Proxy proxy)
- throws IOException {
- if (null == u || null == proxy) {
- throw new IllegalArgumentException(Messages.getString("luni.1B"));
- }
- return new HttpURLConnectionImpl(u, getDefaultPort(), proxy);
- }
此时会创建HttpURLConnectionImpl对象。HttpURLConnectionImpl是java.net.HttpURLConnection的子类。 该类有个成员变量
HttpConnection connection;这才是我们要找的,该类对Socket进行了封装。
HttpConnection 部分源码如下:
private Socket socket;
- private SSLSocket sslSocket;
- private InputStream inputStream;
- private OutputStream outputStream;
- private InputStream sslInputStream;
- private OutputStream sslOutputStream;
- private HttpConfiguration config;
- public HttpConnection(HttpConfiguration config, int connectTimeout) throws IOException {
- this.config = config;
- String hostName = config.getHostName();
- int hostPort = config.getHostPort();
- Proxy proxy = config.getProxy();
- if(proxy == null || proxy.type() == Proxy.Type.HTTP) {
- socket = new Socket();
- } else {
- socket = new Socket(proxy);
- }
- socket.connect(new InetSocketAddress(hostName, hostPort), connectTimeout);
- }
- 现在UrlConnection连接和Socket连接的区别应该十分清楚了吧。
- 使用UrlConnection比直接使用Socket要简单的多,不用关心状态和线程治理。
- UrlConnection基于Http协议,只是进行了封装,添加了一些额外规则(如头信息),本质上也是建立TCP连接,利用Socket
- 实现连接和传输数据的,不过我们一般每次请求完数据后都会实现finally方法,在该方法里封闭连接。
四周是相关类的源码。
可以往这个链接地址查找更多类的源码:
http://www.docjar.com/projects/apache-harmony-6.0-src-r917296-snapshot-code.html
UrlConnection连接和Socket连接的区别的更多相关文章
- TCP连接、Http连接与Socket连接
1.TCP连接 手机能够使用联网功能是因为手机底层实现了TCP/IP协议,可以使手机终端通过无线网络建立TCP连接.TCP协议可以对上层网络提供接口,使上层网络数据的传输建立在“无差别”的网络之上. ...
- 比较 http连接 vs socket连接
http连接 :短连接,客户端,服务器三次握手建立连接,服务器响应返回信息,连接关闭,一次性的socket连接:长连接,客户端,服务器三次握手建立连接不中断(通过ip地址端口号定位进程)及时通讯,客户 ...
- 轮询、长轮询、长连接、socket连接、WebSocket
轮询:客户端定时向服务器发送Ajax请求,服务器接到请求后马上返回响应信息并关闭连接. 优点:后端程序编写比较容易. 缺点:请求中有大半是无用,浪费带宽和服务器资源.(而每一次的 HTTP 请求和应答 ...
- Http和Socket连接区别
相信不少初学手机联网开发的朋友都想知道Http与Socket连接究竟有什么区别,希望通过自己的浅显理解能对初学者有所帮助. 1.TCP连接 要想明白Socket连接,先要明白TCP连接.手机能够使用联 ...
- Http、tcp、Socket连接区别
转自Http.tcp.Socket连接区别 相信不少初学手机联网开发的朋友都想知道Http与Socket连接究竟有什么区别,希望通过自己的浅显理解能对初学者有所帮助. 1.TCP连接 要想明白Sock ...
- Http和Socket连接的区别
Http和Socket连接区别 相信不少初学手机联网开发的朋友都想知道Http与Socket连接究竟有什么区别,希望通过自己的浅显理解能对初学者有所帮助. 1.TCP连接 要想明白Socket连接,先 ...
- socket连接和http连接的区别
socket连接和http连接的区别 HTTP协议:简单对象访问协议,对应于应用层 ,HTTP协议是基于TCP连接的 tcp协议: 对应于传输层 ip协议: 对应于网络层 TCP/IP ...
- 转 Cocos网络篇[3.2](3) ——Socket连接(1)
Cocos网络篇[3.2](3) ——Socket连接(1) 2015-03-05 22:24:13 标签:network http socket cocos [唠叨] 在客户端游戏开发中,使用HTT ...
- Http和Socket连接
转自http://hi.baidu.com/%D2%B9%D1%A9%B3%E6/blog/item/d6a72d2bbf467cf2e7cd406d.html 相信不少初学手机联网开发的朋友都想知道 ...
随机推荐
- freemarker语法简介
ftl是一种模板标记语言,用于渲染数据,输入html结构.语法简介如下: ${book.name} ${book.name?if_exists} //值是否存在 ${book.name??} //值是 ...
- CentOS 6.5系统安装配置图解教程
说明: 截止目前CentOS 6.x最新版本为CentOS 6.5,下面介绍CentOS 6.5的具体安装配置过程 服务器相关设置如下: 操作系统:CentOS 6.5 64位 IP地址:192.16 ...
- 解答WPF中ComboBox SelectedItem Binding不上的Bug
正在做一个打印机列表,从中选择一个打印机(System.Printing) <ComboBox Width="150" ItemsSource="{Binding ...
- Windows的Subversion备份脚本
2015-12-08更新:备份时添加--revision head 只备份最新的版本,已从脚本中移除. 2013-12-09更新:forfiles命令添加错误输出日志. 2013-12-04更新:添加 ...
- Mininet建立topology zoo中的拓扑
以前用Mininet建立拓扑都是在别人的代码上进行需求上的修改,这次从头开始将topology zoo(http://www.topology-zoo.org/)中的拓扑用Mininet建立,不失一般 ...
- Xamarin.Forms 现已开启对 UWP 的支持
Xamarin.Forms 现已升级到 2.0.0.6482 , 正式开启了对 UWP 的支持. 要创建 UWP 项目, 必须是 VS2015, WIN8.1 下也可以, 但是只有 Windows 1 ...
- 关于RESTFul初步理解
RESTFul架构:是目前最流行的一种互联网软件架构.它结构清晰.符合标准.易于理解.扩展方便,所以正得到越来越多网站的采用. 即:Representational State Transfer 表现 ...
- iOS开发小技巧--利用运行时得到隐藏的成员变量
一.关于运行时,已经从网络上摘抄了一片文章,这里只有项目中自己的简单使用 -- 查找隐藏的成员变量 导入头文件 可以获得隐藏的成员变量,方法,属性等 代码: 打印效果图:
- WPF学习(三)--Menu、TabControl和DataGrid控件介绍
Menu Menu提供了菜单栏方式的多级菜单的管理和操作: 这里对Menu的样式不做任何的定制和管理 下面来对Menu进行测试: 将Menu添加到页面中 运行后,效果如下: 这里没有考虑界面效果和样式 ...
- .NET Core 在Visual Studio 2015 下的使用-MSDN
.NET Core RC2 现已推出,这是真正的"候选发布"而非 RC1 Beta 冒充的候选发布(如果是那样,请考虑发布后出现的所有更改).当前,围绕 .NET Core 的开发 ...