-
java的URL和Socket区别_UrlConnection连接和Socket连接的区别
2021-03-16 13:12:45关于UrlConnection连接和Socket连接的区别,只知道其中的原理如下:抽象一点的说,Socket只是一个供上层调用的抽象接口,隐躲了传输层协议的细节。urlconnection 基于Http协议,Http协议是应用层协议,对传输层Tcp...关于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(
"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 实现了 java.security.PrivilegedAction接口,会执行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方法,在该方法里封闭连接。
-
URL和URI的区别
2019-07-05 15:58:35在做后端的过程中,经常会遇到URL和URI这两个名词,以前一直觉得他俩没什么却别,都是一个连接地址罢了,今天看restul教程的时候,提到URI,实在搞不明白到底是什么,就上网查了他们的区别,特开贴记录 不用看太...在做后端的过程中,经常会遇到URL和URI这两个名词,以前一直觉得他俩没什么却别,都是一个链接地址罢了,今天看restful教程的时候,提到URI,实在搞不明白到底是什么,就上网查了他们的区别,特开贴记录
-
不用看太专业的文章
除非你是专门深入研究这块的,否则不用看太专业的文章,网上对这个概念解释的也是五花八门的,我觉得我看不懂这些o(╯□╰)o -
概念区别
URL = Universal Resource Locator 统一资源定位符
URI = Universal Resource Identifier 统一资源标志符
顾名思义。Locator:位置,定位,identifier:标识。
URI:某个网络资源的标记
URL:访问网络上某个URI的路径
总结
URI仅仅标记了一个网络资源
URL用地址的形式访问该网络资源,并且给出了访问路径
URL一定是URI,但是URI不一定是URL
两者的联系就是:通过URL地址访问网络资源URI -
-
url和超级url的区别
2020-08-04 22:50:33URL,统一资源定位符 (Uniform Resource Locator, URL) 是用于完整bai地描述Internet上网页和du其他资源的地址的一种标识方法。俗称zhi“网址”。 所谓的超链dao接是指从一个网页指向一个目标的连接关系,这个目标可以...URL,统一资源定位符 (Uniform Resource Locator, URL) 是用于完整bai地描述Internet上网页和du其他资源的地址的一种标识方法。俗称zhi“网址”。
所谓的超链dao接是指从一个网页指向一个目标的连接关系,这个目标可以是另一个网页,也可以是相同网页上的不同位置,还可以是一个图片,一个电子邮件地址,一个文件,甚至是一个应用程序。
URL只是网页上超链接的一种 -
H2数据库连接的jdbc中url的区别
2018-10-12 11:28:14H2数据库连接的jdbc中url的区别 h2分嵌入模式和服务模式 1:嵌入模式的url的写法 #url = jdbc:h2:D:/java/workspace/dss/data/dss #由本程序进行数据库操作的独占,如果启动了数据库服务,则报错 — 嵌入模式 #不能...H2数据库连接的jdbc中url的区别
h2分嵌入模式和服务模式
1:嵌入模式的url的写法
#url = jdbc:h2:D:/java/workspace/dss/data/dss
#由本程序进行数据库操作的独占,如果启动了数据库服务,则报错 — 嵌入模式
#不能开h2数据库的2:服务模式url的写法
url = jdbc:h2:tcp://localhost/D:/java/workspace/dss/data/dss
#可共享,可以在本地启动数据库server,进行数据库的增删改查 — server模式
#必须要开h2数据库的,不开就会报错的区别:
1、嵌入模式中没有tcp://localhost
2、嵌入模式不能开h2数据库,服务模式必须开h2数据库,不开会报错的。 -
内连接和等值连接的区别
2014-06-09 15:46:29内连接和等值连接的区别 url: 内连接就是满足连接条件的结果集,这是相对于外连接而言。 外连接即使找不到满足条件的记录,另一方的记录还是要输出 INNER JOIN可以不等: select * from t1 inner join... -
连接oralce数据库url的区别
2012-10-10 12:04:53连接oralce数据库url: jdbc:oracle:thin:@10.18.1.11:1522:orcl和 jdbc:oracle:thin:@10.18.1.11:1522/orcl 这两种连接方式有什么区别?经测试这两种都可以使用 -
oracle11g的JDBC连接 URL和之前的版本有一定的区别
2013-03-28 21:43:03今天安装了oracle11g后,写了JDBC测试程序,一直都连接不上! 一直找不到原因 ...后来读了一下安装文件中的Readme.txt文档,汗啊!这个版本居然把url的访问方式改变了: Some Useful Hints In Using the J... -
连接MySQL数据库URL在windows和suse下面的区别
2013-04-26 22:09:03最近遇到了mysql连接url不同,导致程序出现乱码的问题,采用的是spring架构,同样的程序和数据库运行在不同的平台上就出现了乱码问题,经查实是url出错,导致参数无法读进来。 先记录一下,以待解决: 1.连接... -
转载 - URL和URI的区别
2011-01-19 13:47:00url:同一资源定位符uri:同一资源标志符url定位客户端连接到服务器所需要的信息,如http://www.csdn.nethttp://tcc.com:8080/servlet/logon?name=zhangsan&addr=tttt完整构成<protocol>://<servername&... -
URI、URL和URN之间的区别与联系
2021-01-19 20:23:57URI:Uniform Resource Identifier... URN:URL的一种更新形式,统一资源名称(URN, Uniform Resource Name)不依赖于位置,并且有可能减少失效连接的个数。但是其流行还需假以时日,因为它需要更精密软件的支持。 U -
URI和URL的区别及联系
2020-06-03 00:13:21先介绍一下,URI(统一资源标识符),URL(Uniform Resource Locator,统一...另一种就是URN,这是URL的一种更新形式,URN不依赖于位置,并且有可能减少失效连接的个数。但是其流行还需假以时日,因为它需要更精密软件 -
php urldecode 加号不显示_python/print 中的逗号和加号连接字符串的作用区别
2021-01-04 15:13:532020.4.9输入和输出密码的两种方式像input中得到的输入数据的类型是string类型,所以和双引号中的数据类型是相同的,均为string.所以在输出的时候可以用+号来相连接(这个是我在扇贝编程里面学到的),因此输出的... -
jdbc连数据库时的url中的“:”是什么意思, jdbc连接数据库使用sid和service_name的区别
2019-07-26 18:23:26jdbc连数据库时的url中的“:”是什么意思? 查url的rfc文档 :是一种协议约定,用来分割协议或者域 问题来源: 项目配置文件如下写法 ,都可以用 Navicat链接属性:(同一个ip地址) sid连接成功 服务名... -
http的持久连接和非持久连接区别
2015-06-06 20:30:56HTTP 协议概要 非持久连接 ...设这个网页的URL为www.server.com/somepath/index.html。如果用户请求该网页并采用“非持久连接”,那么在HTTP 客户(通常是用户浏览器)和服务器之间将发生以下操作: 1. HTTP 客 -
HTTP协议的请求类型?URI和URL的区别? 常见的响应状态码?
2021-04-15 09:14:34GET、POST、PUT、DELETE、HEAD、OPTIONS、TRACE、CONNECT ...URI和URL的区别 HTTP使用统一资源标识符(URI)来传输数据和建立连接。 URI:Uniform Resource Identifier 统一资源标识符 URL:Uniform Resource Lo -
URL和URI区别
2010-06-19 16:42:19url:同一资源定位符 uri:同一资源标志符,url定位客户端连接到服务器所需要的信息,如:http://www.csdn.net ,http://tcc.com:8080/servlet/logon?name=zhangsan&addr=tttt 完整构成 ://[:p... -
Sql Server2000和2005的连接代码区别
2009-09-15 15:25:00Sql Server2000和2005的连接代码区别写连接代码时需要注意2000和2005的不同:1、连接SqlServer2000Class.forName("com.microsoft.jdbc.sqlserver.SQLServerDriver").newInstance();URL = "jdbc:microsoft:sqlserver:... -
内连接和外连接区别
2009-07-30 10:38:26在之前,我对MSSQL中的内连接和外连接所得出的数据集不是很清楚。这几天重新温习了一下SQL的书本,现在的思路应该是很清楚了,现在把自己的理解发出来给大家温习下。希望和我一样对SQL的连接语句不太理解的朋友能够... -
URL类openStream方法和openConnection方法的区别
2020-07-26 00:30:43可以看Java帮助文档,就能清楚它们之间的区别: public URLConnection openConnection() throws IOException——返回一个URLConnection对象,它表示到URL所引用的远程对象的连接。每次调用此URL的协议处理程序的... -
Oracle的数据库访问Url: oci 和 thin 的区别
2010-08-31 09:41:00//看看thin和oci的url写法上的区别: jdbc:oracle:thin:@server ip: service jdbc:oracle:oci:@service /* 1)从使用上来说,oci必须在客户机上安装oracle客户端或才能连接,而thin就不需要,因此从使用上... -
JDBC Sql Server2000和2005的连接代码区别
2009-01-31 14:38:00Sql Server2000和2005的连接代码区别 写连接代码时需要注意2000和2005的不同:1、连接SqlServer2000 Class.forName("com.microsoft.jdbc.sqlserver.SQLServerDriver").newInstance(); URL = "jdbc:microsoft:sql... -
数据库mysql8.0以上和以下的连接池区别
2020-06-08 17:03:47url: jdbc:mysql://localhost:3306/shopping?useUnicode=true&characterEncoding=utf-8&useSSL=true&serverTimezone=UTC driver-class-name: com.mysql.cj.jdbc.Driver 2、5.6的写法 jdbc.driver=com.my -
eclipse连接mysql和oracle的区别_eclipse
2021-02-02 01:31:32在要连接的数据库中类添加如下java代码(也可以作为一个类进行封装)即可Connection conn = null;try {Class.forName("oracle.jdbc.driver.OracleDriver"); //注册数据库驱动try {String url = "jdbc:oracle:thin:@... -
url是什么? http1.0和http1.1的区别?常见的网络架构
2019-10-28 11:16:34本文为学习笔记 URL:统一资源定位符(uniform...http1.0和http1.1的区别: http1.0:一次连接只能有一次请求。(浪费资源) http1.1:一次连接可以有多次请求。(keep-alive) 常见的网络架构: C/S:clien...