在信息交互系统设计中,不乏有自定义通讯协议设计。本章会介绍如何利用
java.net.URL
类来自定义协议。
一般而言,
URL
的格式是:
protocol://[authority]hostname:port/resource?queryString
。
URL
类能够解析出
protocol
、
hostname
、
port
等信息。
Protocol
决定了交互规范,通用的协议,比如
HTTP
、
File
、
FTP
等协议,
JDK
自带了默认的通讯实现。当然,自定义实现是允许的。
Hostname
和
port
一般用于
Socket
或者基于
Socket
其他协议通讯方式。
Resource
即资源上下文。可能读者利用
URL
,通过指定协议(
protocol
)来获取指定资源的读写,比如
JDK
内置了
HTTP
、
File
、
FTP
等协议的处理方法。哪么
URL
的工作原理到底是怎么样的呢?
在成功地构造
URL
实例之后,
URL
API
中定义了一个
openConnection()
方法,返回一个
java.net.URLConnection
抽象类型的实例。不过,这里
URL
对象是代理对象(组合了
其
对象),实际调用的是,
java.net.URLStreamHandler
对象的
openConnection()
方法。
java.net.URLStreamHandler
对象可以有两条途径得到:实现
java.net.URLStreamHandler
,或者实现
java.net.URLStreamHandlerFactory
。
java.net.URLStreamHandler
是一个工厂类,通过
openConnection(java.net.URL)
方法来创建
java.net.URLConnection
的实例。
java.net.URLStreamHandler
实现灵活度很大,既可以通过不同
protocol
的
URL
实例,产生
java.net.URLConnection
对象。还可以通过相同
protocol
的多个
URL
对象,来产生对象。通用性实现,一种协议对应一个
java.net.URLStreamHandler
实现。比如,在
SUN
JDK
中
sun.net.www.protocol
子包下面的多个
Handler
类就是很好的例子。如果读者有兴趣,可以去看看相关实现。
1.
通过
java.net.URLStreamHandlerFactory
机制
java.net.URLStreamHandlerFactory
,顾名思义,它是
java.net.URLStreamHandler
的工厂,即抽类工厂接口。通过调用
createURLStreamHandler(String
protocol)
来创建
java.net.URLStreamHandler
对象。因此,建议
java.net.URLStreamHandlerFactory
实现类应该采用
one
protocol one hander
的模式,
SUN
JDK
也采用该模式。
大致解了他们关系之后,再通过
UML
Class diagram
来熟悉下:
(图
1
)
图
1
所示,
URL
包含了名为
factory
的
URLStreamHandlerFactory
类对象和
handler
的
URLStreamHandler
的实例对象。对于
URL
而言,
handler
对象是必须的,因为前面说到实际处理
openConnection()
方法是
handler
对象,而
factory
并不是必须的。接下来,来分析这两个对象是如何和
URL
交互的。
在
URL
的构造方法中,暂时不用关心协议字符串等参数,更多的关注于
URL
context
和
URLStreamHandler
参数。
URL
实例能够依赖于
URL
context
,当
URLStreamHandler
参数为空的情况下,当前
URL
实例将会采用
URL
context
的
URLStreamHandler
成员对象。当
Context
和
URLStreamHandler
参数都为空的时。
URL
会调用
getURLStreamHandler
(
String)
方法,从而根据协议
(protocol)
获得协议
URLStreamHandler
对象。
在
URL
底层实现中,最初会初始化一个
protocol
和
hander
键值关系的
Map
映射。如果找到已有的映射关系,立即返回
URLStreamHandler
对象(第一次是取不到
URLStreamHandler
对象的)。
如果找不到的话,并且
URL
类中的类成员
URLStreamHandlerFactory
实例不为空的情况下,这个实例通过
URL#setURLStreamHandlerFactory
方法来注册。
getURLStreamHandler
方法会调用这个类成员的
createURLStreamHandler(String)
方法来创建
URLStreamHandler
实例。
URL.setURLStreamHandlerFactory(new MyURLStreamHandlerFactory());
(代码
1
)
class MyURLStreamHandlerFactory implements URLStreamHandlerFactory{
@Override
public URLStreamHandler createURLStreamHandler(String protocol) {
return null;
}
}
(代码
2
)
当
createURLStreamHandler
方法返回
null
的时候,
URL
的
getURLStreamHandler
方法会采用
URLStreamHandler
处理机制。
2.
通过
java.net.URLStreamHandler
机制
2.1.
实现类包路径定义
通过
JVM
启动参数
-D
java.protocol.handler.pkgs
来设置
URLStreamHandler
实现类的包路径,例如
-D
java.protocol.handler.pkgs=com.acme.protocol
,
代表处理实现类皆在这个包下。如果需要多个包的话,那么使用“
|”
分割。比如
-D
java.protocol.handler.pkgs=com.acme.protocol|com.acme.protocol2
。
SUN
的
JDK
内部实现类均是在
sun.net.www.protocol.
包下,不必设置。
路径下的协议实现类,采用先定义先选择的原则
。
2.2.
实现类的命名模式
类的命名模式为
[package_path].[protocol].Handler
,比如默认实现”
sun.net.www.protocol.[protocol].Handler”,
比如
HTTP
协议的对应的处理类名为
-sun.net.
www.protocol.http.Handler
。同样,自定义实现的处理类,例如,
JDNI
协议实现类命名
com.acme.protocol.jndi.Handler
。
2.3.
实现类必须又默认构造器。
结合代码分析,如下:
URL httpURL = new URL(null, "http://www.google.com",URLStreamHandler)null);
URLConnection urlConn = httpURL.openConnection();
(代码
3
)
代码
3
中没有配置
URLStreamHandler
的类,并且代码
2
中工厂类没有实现了
HTTP
协议。这样,
URL
会获取默认的
HTTP
处理类
sun.net.
www.protocol.http.Handler
。
Java
1.5
开始支持网络代理的操作,因此
URLStreamHandler
实现类尽量覆盖
openConnection(URL)
和
openConnection(URL,Proxy)
两个方法。
(EOF)
- 大小: 75.9 KB
分享到:
相关推荐
多协议扩展支持(REST, RPC, SOAP, etc) Rails3消息队列系统 Sidekiq Sidekiq 为 Rails 3 应用程序提供一个高效的消息队列系统。 Java文件上传组件 COS FAT文件系统读写类库 fat32-lib fat32-lib 是一个用来读写...
多协议扩展支持(REST, RPC, SOAP, etc) Rails3消息队列系统 Sidekiq Sidekiq 为 Rails 3 应用程序提供一个高效的消息队列系统。 Java文件上传组件 COS FAT文件系统读写类库 fat32-lib fat32-lib 是一个用来读写...
例如,容易实现协议的设计。 Java EJB中有、无状态SessionBean的两个例子 两个例子,无状态SessionBean可会话Bean必须实现SessionBean,获取系统属性,初始化JNDI,取得Home对象的引用,创建EJB对象,计算利息等;...
例如,容易实现协议的设计。 Java EJB中有、无状态SessionBean的两个例子 两个例子,无状态SessionBean可会话Bean必须实现SessionBean,获取系统属性,初始化JNDI,取得Home对象的引用,创建EJB对象,计算利息等;...
多协议扩展支持(REST, RPC, SOAP, etc) Rails3消息队列系统 Sidekiq Sidekiq 为 Rails 3 应用程序提供一个高效的消息队列系统。 Java文件上传组件 COS FAT文件系统读写类库 fat32-lib fat32-lib 是一个用来读写...
多协议扩展支持(REST, RPC, SOAP, etc) Rails3消息队列系统 Sidekiq Sidekiq 为 Rails 3 应用程序提供一个高效的消息队列系统。 Java文件上传组件 COS FAT文件系统读写类库 fat32-lib fat32-lib 是一个用来读写...
多协议扩展支持(REST, RPC, SOAP, etc) Rails3消息队列系统 Sidekiq Sidekiq 为 Rails 3 应用程序提供一个高效的消息队列系统。 Java文件上传组件 COS FAT文件系统读写类库 fat32-lib fat32-lib 是一个用来读写...
多协议扩展支持(REST, RPC, SOAP, etc) Rails3消息队列系统 Sidekiq Sidekiq 为 Rails 3 应用程序提供一个高效的消息队列系统。 Java文件上传组件 COS FAT文件系统读写类库 fat32-lib fat32-lib 是一个用来读写...
多协议扩展支持(REST, RPC, SOAP, etc) Rails3消息队列系统 Sidekiq Sidekiq 为 Rails 3 应用程序提供一个高效的消息队列系统。 Java文件上传组件 COS FAT文件系统读写类库 fat32-lib fat32-lib 是一个用来读写...
多协议扩展支持(REST, RPC, SOAP, etc) Rails3消息队列系统 Sidekiq Sidekiq 为 Rails 3 应用程序提供一个高效的消息队列系统。 Java文件上传组件 COS FAT文件系统读写类库 fat32-lib fat32-lib 是一个用来读写...
多协议扩展支持(REST, RPC, SOAP, etc) Rails3消息队列系统 Sidekiq Sidekiq 为 Rails 3 应用程序提供一个高效的消息队列系统。 Java文件上传组件 COS FAT文件系统读写类库 fat32-lib fat32-lib 是一个用来读写...
多协议扩展支持(REST, RPC, SOAP, etc) Rails3消息队列系统 Sidekiq Sidekiq 为 Rails 3 应用程序提供一个高效的消息队列系统。 Java文件上传组件 COS FAT文件系统读写类库 fat32-lib fat32-lib 是一个用来读写...
Java应用编程接口为Java应用提供了一 个独立于操作系统的标准接口,可分为基本部分和扩展部分。在硬件或操作系统平台上 安装一个Java平台之后,Java应用程序就可运行。现在Java平台已经嵌入了几乎所有的 操作系统。...
多协议扩展支持(REST, RPC, SOAP, etc) Rails3消息队列系统 Sidekiq Sidekiq 为 Rails 3 应用程序提供一个高效的消息队列系统。 Java文件上传组件 COS FAT文件系统读写类库 fat32-lib fat32-lib 是一个用来读写...
多协议扩展支持(REST, RPC, SOAP, etc) Rails3消息队列系统 Sidekiq Sidekiq 为 Rails 3 应用程序提供一个高效的消息队列系统。 Java文件上传组件 COS FAT文件系统读写类库 fat32-lib fat32-lib 是一个用来读写...
多协议扩展支持(REST, RPC, SOAP, etc) Rails3消息队列系统 Sidekiq Sidekiq 为 Rails 3 应用程序提供一个高效的消息队列系统。 Java文件上传组件 COS FAT文件系统读写类库 fat32-lib fat32-lib 是一个用来读写...
JAVA中如何实现多线程(重点!!) 168 通过继承Thread类实现多线程 168 通过Runnable接口实现多线程 169 线程状态和sleep/yield/join/stop/destroy方法 170 新生状态 170 就绪状态 170 运行状态 170 死亡状态 170 ...
请求网页: 爬虫使用HTTP或其他协议向目标URL发起请求,获取网页的HTML内容。这通常通过HTTP请求库实现,如Python中的Requests库。 解析内容: 爬虫对获取的HTML进行解析,提取有用的信息。常用的解析工具有正则...
第1章 Java概述 1 1.1 Java语言的发展简史 2 1.2 Java的竞争对手及各自优势 4 1.2.1 C#简介和优势 4 1.2.2 Ruby简介和优势 4 1.2.3 Python的简介和优势 5 1.3 Java程序运行机制 5 1.3.1 高级语言的运行机制 6...