`

Java URL协议扩展实现

阅读更多

        在信息交互系统设计中,不乏有自定义通讯协议设计。本章会介绍如何利用 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
2
1
分享到:
评论
5 楼 hanmiao 2019-04-03  
谢谢分享,上周遇到了壹个和 java.protocol.handler.pkgs 相关的问题,不理解,这篇文章正好帮我扫盲。
4 楼 javatozhang 2014-05-30  
没有细细的研究过URL类,文章不错!
3 楼 bin_1715575332 2013-07-01  
呵呵,很好的文章,这方面的文章不多啊。
2 楼 mercyblitz 2010-08-18  
suifeng 写道

兄台也在研究通信协议, 有问题得请教请教


相互交流咯,客气了!
1 楼 suifeng 2010-08-18  

兄台也在研究通信协议, 有问题得请教请教

相关推荐

    java URL 下载器实例

    Java URL下载器是一种实用工具,它允许用户从指定的URL抓取并下载文件。这个实例是基于Java编程语言实现的,特别强调了多线程技术,以提高下载速度和效率。下面将详细介绍这个下载器的工作原理、核心概念以及如何...

    通过JAVA语言实现使用URL访问网络资源

    ### 通过JAVA语言实现使用URL访问网络资源 #### 一、URL概述与基本概念 URL(Uniform Resource Locator),即统一资源定位符,是用于标识互联网上特定资源的地址。通过给定的URL,浏览器能够找到相应的文件或其他...

    java实现http协议jar包

    Java实现HTTP协议的jar包是Java后端开发中常用的一种工具,它可以帮助开发者方便地进行HTTP请求的发送和处理响应。这些jar包包含了多种库,主要用于构建和执行HTTP客户端操作,如GET、POST等方法。以下是对每个jar包...

    javaURL分析.

    Java URL(统一资源定位符)是Java编程语言中用于表示互联网资源地址的一种类。它遵循通用的URI(统一资源标识符)标准,并扩展了HTTP、FTP等特定协议的支持。理解和熟练使用Java URL对于进行网络编程至关重要,特别...

    Java URL自定义私有网络协议

    Java URL自定义私有网络协议允许开发者扩展Java的标准网络功能,创建自己的通信协议,这在某些特定场景下非常有用,例如在需要与非标准服务端交互或者实现特定数据传输格式时。通过理解和利用Java的URL处理机制,...

    URL参数加密解密(java版)

    本文将深入探讨如何在Java中实现URL参数的加密与解密。 1. **加密算法选择**: - 对于URL参数的加密,通常使用对称加密算法,如AES(高级加密标准)或者DES(数据加密标准),因为它们速度快,适合大量数据的加密...

    Java源代码根据URL获取因特网网页源文件.rar

    在Java编程中,从URL获取因特网网页源文件是一项基本任务,这通常涉及到网络编程和HTTP协议。这个RAR文件包含的"说明.txt"可能是详细的操作指南,而"根据URL获取因特网网页源文件"可能是一个Java源代码示例,用于...

    URL.rar_java url_java 下载_url

    在Java编程语言中,URL(Uniform Resource Locator)是用于定位互联网资源的一种标准格式。它包含了协议类型(如HTTP、HTTPS)、主机名、路径等信息,是访问网络资源的基础。本教程将详细介绍如何在Java中使用URL...

    Java SOAP协议

    ### Java SOAP协议详解 #### 一、概述与背景 SOAP(Simple Object Access Protocol)是一种轻量级协议,用于在分布式环境中进行数据交换。SOAP最初由IBM、Microsoft等公司在1998年提出,并随后被标准化为W3C推荐...

    java上传图片至服务器并且返回下载URL

    总结来说,实现"java上传图片至服务器并且返回下载URL"的功能,主要涉及HTTP文件上传、文件存储、路径管理、响应处理和安全性控制等多个方面,结合Servlet、Spring等相关技术可以有效地完成这一任务。在开发过程中,...

    基于java的WebSocket协议的实现 WebSocket4J.zip

    在Java环境中实现WebSocket协议,开发者通常会利用Java API for WebSocket(JSR 356)或者第三方库,如WebSocket4J。WebSocket4J是一个轻量级的、易于使用的Java WebSocket框架,它提供了对WebSocket协议的全面支持...

    基于JAVA的websocket实现(含java后端)

    总的来说,基于Java的WebSocket实现涉及到网络编程、协议解析、多线程以及可能的并发控制等多个方面。理解WebSocket的工作原理和Java API的使用是实现WebSocket服务的关键。在实际开发中,还需要根据具体需求进行...

    用JAVA实现远程图片批量下载

    使用Java实现远程图片批量下载不仅可以提高下载效率,还能有效地管理URL和已下载的图片,减少资源浪费。此外,通过扩展此框架,还可以实现对其他类型网络资源的批量下载。这种方法在面向网络信息搜集方面具有重要的...

    java实现ocp客户端

    Java 实现 OPC 客户端主要是为了与工业自动化设备或系统进行数据交换,OPC (OLE for Process Control) 是一种标准接口,允许应用程序之间进行数据通信,尤其在制造业和过程控制领域广泛应用。Jeasyopc 是一个 Java ...

    Java2网络协议技术内幕

    《Java2网络协议技术内幕》是一本专注于Java网络编程的深度教程,涵盖了网络协议的核心概念以及如何在Java中实现这些协议。这本书不仅提供了理论知识,还包含实际的源代码,使得读者能够通过实践来深入理解网络协议...

    java 判断两个网址的主机名是否一样

    在Java编程中,判断两个网址的主机名是否相同是一个常见的任务,这通常涉及到网络编程和URL对象的使用。下面我们将详细探讨如何实现这个功能,并深入理解相关知识点。 首先,URL(Uniform Resource Locator)是统一...

    HTTP digest RFC2671规范 加密实现(JAVA)

    在Java中,实现这些功能可能涉及使用`java.security.MessageDigest`类来处理MD5哈希,以及`java.util.Base64`来编码和解码数据。例如,`Digests.java`可能会包含以下方法: 1. `createMD5Hash`: 用MD5算法对字符串...

    Java网络爬虫的实现

    Java网络爬虫的实现不仅是技术实践,也是一个综合运用Java编程能力、网络协议知识、数据处理技术的过程。同时,随着对Java平台上的多语言混合编程的认知,可以将爬虫项目进一步扩展到更灵活的编程实践中。在开发过程...

    java源码:WebSocket协议的Java实现 WebSocket4J.rar

    4. **扩展支持**:WebSocket协议允许自定义扩展以增强功能,WebSocket4J也提供了扩展点,开发者可以根据需要实现自己的扩展机制。 5. **安全考虑**:WebSocket4J考虑了安全性,支持SSL/TLS加密,确保在不安全的网络...

    java开源包3

    多协议扩展支持(REST, RPC, SOAP, etc) Rails3消息队列系统 Sidekiq Sidekiq 为 Rails 3 应用程序提供一个高效的消息队列系统。 Java文件上传组件 COS FAT文件系统读写类库 fat32-lib fat32-lib 是一个用来读写...

Global site tag (gtag.js) - Google Analytics