`

Java自定义URL协议

 
阅读更多

        Java 提供了对 URL 协议进行扩展的能力,通过扩展用户可以自定义 URL 通信协议, JDK 默认提供了对 HTTP,FTP,JAR,FILE 等的实现,而当需要自己定义通信协议的时候,就需要利用 JDK 提供的对 URL 扩展机制进行自定义。

         JDK 主要提供了如下三种方式对 URL 进行扩展,每种方式都有各自的使用场景,下面我们分别看看具体 JDK 都给我们提供了哪些扩展点。

1.         实现 URLStreamHandlerFactory 接口,然后调用 URL.setURLStreamHandlerFactory.

采用这种方式的情况下,需要确保应用的其他地方没有调用 setURLStreamHandlerFactory ,因为此方法只能调用一次,如果多次调用会抛出 java.lang.Error: factory already defined. 比如在一些应用服务器的中使用的时候就要多加注意。

 

2.         创建 URLStreamHandler 的子类,这种方式必须满足如下两个约定:

a)         子类的类名必须是 Handler ,同时最后一级的包名必须是协议的名称,比如你自己定义了名为 mem 的协议,那么 handler 的全名不须是 com.company.protocol.Handler.

b)         JVM 启动的时候,需要设置 java.protocol.handler.pkgs 系统属性,如果有多个实现类,那么中间用 | 隔开。

 

上面两个约定我们可以通过查看 JDK 中的 URL 的源代码,可以清晰的看到为什么要遵循这两个约定。下面我们就看一下 JDK 中关于 URL 的源代码。

static URLStreamHandler getURLStreamHandler(String protocol) {
		  …… ……   
            
            if (handler == null) {
           	 //这里获取java.protocol.handler.pkgs系统属性,同时用“|”隔开 
                String packagePrefixList = null;
                packagePrefixList
                    = (String) java.security.AccessController.doPrivileged(
                    new sun.security.action.GetPropertyAction(
                        protocolPathProp, ""));
                if (packagePrefixList != "") {
                    packagePrefixList += "|";
                }

                // REMIND: decide whether to allow the "null" class prefix
                // or not.
                packagePrefixList += "sun.net.www.protocol";
			
                
                StringTokenizer packagePrefixIter =
                    new StringTokenizer(packagePrefixList, "|");

                while (handler == null &&
                    packagePrefixIter.hasMoreTokens()) {

                    String packagePrefix =
                        packagePrefixIter.nextToken().trim();
                    try {
					//这里packagePrefix就是你自己制定的包名,protocol为你自定义的协议名,这
                        String clsName = packagePrefix + "." + protocol +
                            ".Handler";
                        Class cls = null;
                        try {
                            cls = Class.forName(clsName);// 用加载URL的类加载器加载
                        } catch (ClassNotFoundException e) {
                            ClassLoader cl = ClassLoader.getSystemClassLoader(); //采用系统类加载器加载
                            if (cl != null) {
                                cls = cl.loadClass(clsName);
                            }
                        }
                        if (cls != null) {
                            handler =
                                (URLStreamHandler) cls.newInstance();
                        }
                    } catch (Exception e) {
                        // any number of exceptions can get thrown here
                    }
                }
            }
        }
}

当采用这种方法的时候,需要注意的是自己写的 Handler 类必须放在系统类加载器可以加载到的地方。

 

3   实例化一个 URL 对象的时候传递一个 URLStreamHandler 的实例。这种方式的情况下, JDK 需要一个名为 specifyStreamHandler NetPermission ,这就要求你需要去修改 jdk 安装目录下的 java.policy 文件进行授权。

2
1
分享到:
评论

相关推荐

    Java URL自定义私有网络协议

    URI与URL的区别一.先来序言一段二.协议的自定义的理解三.自定义协议与URL的关系四.URL自定义私有协议实战五.后话,自定义mineType解析器

    java开源包3

    jSIP这个Java包目标是用Java实现SIP(SIP:Session Initiation Protocol)协议及SIP协议的其它扩展部 分。 Java表达式语法解析库 parboiled parboiled 是一个纯Java库提供了一种轻量级,易于使用,功能强大和优雅的PEG...

    JAVA上百实例源码以及开源项目源代码

    Java生成自定义控件源代码 2个目标文件 Java实现HTTP连接与浏览,Java源码下载 1个目标文件 摘要:Java源码,网络相关,HTTP  Java实现HTTP连接与浏览,Java源码下载,输入html文件地址或网址,显示页面和HTML源文件...

    JAVA上百实例源码以及开源项目

    Java生成自定义控件源代码 2个目标文件 Java实现HTTP连接与浏览,Java源码下载 1个目标文件 摘要:Java源码,网络相关,HTTP  Java实现HTTP连接与浏览,Java源码下载,输入html文件地址或网址,显示页面和HTML源文件...

    JAVA清华大学教程

    ◇8.2 基于URL的高层次Java网络编程 ◇8.3 基于Socket的低层次Java网络编程 ◇本讲小结 ◇课后习题 ★ 第九讲 JavaBean和RMI ◇课前索引 ◇9.1 JavaBean的基本概念 ◇9.2 JavaBean开发简介 ◇9.3 RMI的基本...

    java开源包4

    jSIP这个Java包目标是用Java实现SIP(SIP:Session Initiation Protocol)协议及SIP协议的其它扩展部 分。 Java表达式语法解析库 parboiled parboiled 是一个纯Java库提供了一种轻量级,易于使用,功能强大和优雅的PEG...

    java开源包101

    jSIP这个Java包目标是用Java实现SIP(SIP:Session Initiation Protocol)协议及SIP协议的其它扩展部 分。 Java表达式语法解析库 parboiled parboiled 是一个纯Java库提供了一种轻量级,易于使用,功能强大和优雅的PEG...

    清华大学JAVA教程

    ◇8.2 基于URL的高层次Java网络编程 ◇8.3 基于Socket的低层次Java网络编程 ◇本讲小结 ◇课后习题 ★ 第九讲 JavaBean和RMI ◇课前索引 ◇9.1 JavaBean的基本概念 ◇9.2 JavaBean开发简介 ◇9.3 RMI的基本...

    JAVA 清华大学 教程

    ◇8.2 基于URL的高层次Java网络编程 ◇8.3 基于Socket的低层次Java网络编程 ◇本讲小结 ◇课后习题 ★ 第九讲 JavaBean和RMI ◇课前索引 ◇9.1 JavaBean的基本概念 ◇9.2 JavaBean开发简介 ◇9.3 RMI的基本...

    java开源包11

    jSIP这个Java包目标是用Java实现SIP(SIP:Session Initiation Protocol)协议及SIP协议的其它扩展部 分。 Java表达式语法解析库 parboiled parboiled 是一个纯Java库提供了一种轻量级,易于使用,功能强大和优雅的PEG...

    java开源包6

    jSIP这个Java包目标是用Java实现SIP(SIP:Session Initiation Protocol)协议及SIP协议的其它扩展部 分。 Java表达式语法解析库 parboiled parboiled 是一个纯Java库提供了一种轻量级,易于使用,功能强大和优雅的PEG...

    java开源包9

    jSIP这个Java包目标是用Java实现SIP(SIP:Session Initiation Protocol)协议及SIP协议的其它扩展部 分。 Java表达式语法解析库 parboiled parboiled 是一个纯Java库提供了一种轻量级,易于使用,功能强大和优雅的PEG...

    java包与接口实验报告

    3)网络包(java.net):支持Internet的TCP/IP协议,用于实现Socket编程;提供了与Internet的接口,支持URL连接,WWW的即时访问,并且简化了用户/服务器模型的程序设计。 4)抽象图形用户接口包(javax.swing):实现了...

    java开源包8

    jSIP这个Java包目标是用Java实现SIP(SIP:Session Initiation Protocol)协议及SIP协议的其它扩展部 分。 Java表达式语法解析库 parboiled parboiled 是一个纯Java库提供了一种轻量级,易于使用,功能强大和优雅的PEG...

    java开源包5

    jSIP这个Java包目标是用Java实现SIP(SIP:Session Initiation Protocol)协议及SIP协议的其它扩展部 分。 Java表达式语法解析库 parboiled parboiled 是一个纯Java库提供了一种轻量级,易于使用,功能强大和优雅的PEG...

    java开源包10

    jSIP这个Java包目标是用Java实现SIP(SIP:Session Initiation Protocol)协议及SIP协议的其它扩展部 分。 Java表达式语法解析库 parboiled parboiled 是一个纯Java库提供了一种轻量级,易于使用,功能强大和优雅的PEG...

    java jdk实列宝典 光盘源代码

    获取URL信息,主要是使用URLConnection类,GetUrlInfo.java; web浏览器,webbrowser.java; 获取IP地址和域名,GetIpAddress.java; Http客户端,httpClient.java; 基本socket编程,介绍socket编程的基本步骤,启动...

    Java编程语言详细教程

    ◇8.2 基于URL的高层次Java网络编程 ◇8.3 基于Socket的低层次Java网络编程 ◇本讲小结 ◇课后习题 ★ 第九讲 JavaBean和RMI ◇课前索引 ◇9.1 JavaBean的基本概念 ◇9.2 JavaBean开发简介 ◇9.3 RMI的基本...

    java开源包1

    jSIP这个Java包目标是用Java实现SIP(SIP:Session Initiation Protocol)协议及SIP协议的其它扩展部 分。 Java表达式语法解析库 parboiled parboiled 是一个纯Java库提供了一种轻量级,易于使用,功能强大和优雅的PEG...

Global site tag (gtag.js) - Google Analytics