java网络---再论URL & URI

关于URL 和URI的关系,在本系列的第二篇:java网络---基本web概念 中已经简述了。

这里重复一点,就是URI包含URL,或者说URI是父类,URL就是子类的概念。

本篇再来详述这2个概念。

一:URL

java/net/URL.java

public final class URL implements Serializable {
    private static final long serialVersionUID = -7627629688361524110L;

    private static URLStreamHandlerFactory streamHandlerFactory;

    /** Cache of protocols to their handlers */
    private static final Hashtable<String, URLStreamHandler> streamHandlers
            = new Hashtable<String, URLStreamHandler>();

    private String protocol;
    private String authority;
    private String host;
    private int port = -1;
    private String file;
    private String ref;

一个URL就是长的这样样子:http://home.cnblogs.com/u/deman/

所以我们可以使用String简单的描述一个URL。

但考虑URL为一个类可能更有用一些。

这个对象包括,模式,主机名,端口,路径,标识符(ref)。看看上面的源码,就是这些东西!

看看虚拟机支持那些协议,可以编写如下测试程序:

public class ProtocolTester implements IOperator {
    @Override
    public void start() {
        testProtocol("http://www.adc.org");
        testProtocol("https://www.amazon.com");
        testProtocol("ftp://metalab.unc.edu");
        testProtocol("telent://dibner.poly.edu/");
        testProtocol("mailto:[email protected]");
        testProtocol("file:///etc/passwd");
        testProtocol("gopher://gopher.anc.org.za");
        testProtocol("ladp://ldap.itd.umich.edu");
        testProtocol("jar:http://ldap.itd.umich.edu.jar");
        testProtocol("nfs://utopia.poly.edu");
        testProtocol("jdbc:mysql:/utopia.poly.edu");

    }

    private void testProtocol(String url) {
        try {
            URL u = new URL(url);
            TraceLog.i(u.getProtocol()+" is supported");
        } catch (MalformedURLException e) {
//            e.printStackTrace();
//            TraceLog.w(e.getMessage());
            String protocol  = url.substring(0,url.indexOf(‘:‘));
            TraceLog.w(protocol+ " is not supported");
        }
    }

URL组成:

URL有五部分组成,

模式,也称为协议

授权机构

路径

片段标示符,ref

查询字符串

给点URL http://www.ibiblio.org/javafaq/books/jnp/index.html?isbn=1565229#toc

模式     http

授权机构  www.ibiblio.org

路径    javafaq/books/jnp/index.html

片段标示符,ref  toc

查询字符串  isbn=1565229

授权机构可以进一步分为:用户信息,主机,端口。

[email protected]:8080

public class UrlValueTester implements ITestOperator {
    @Override
    public void startTest() {
        try {
            URL u = new URL("http://tieba.baidu.com/f/fdir?fd=%E7%A7%91%E5%AD%A6%E6%8A%80%E6%9C%AF&ie=utf-8&sd=%E8%AE%A1%E7%AE%97%E6%9C%BA%E8%BD%AF%E4%BB%B6");
            method(u);
        } catch (MalformedURLException e) {
            e.printStackTrace();
        } catch (IllegalAccessException e) {
            e.printStackTrace();
        } catch (InvocationTargetException e) {
            e.printStackTrace();
        }
    }

    public void method(URL u) throws InvocationTargetException, IllegalAccessException {
        Class cls = u.getClass();
        Method[] methods = cls.getDeclaredMethods();
        for(Method m:methods)
        {
            try{
                if(m.getName().contains("get"))
                {
                    TraceLog.i(m.getName());
                    TraceLog.i(":"+m.invoke(u));
                }
            }catch (Exception e)
            {
                TraceLog.w(m.getName());
            }

        }
    }

通过反射,获取所有get方法,然后依次获取各个属性。

二:URLEncoder & URLDecoder

URL使用如下字符:

大写字母

小写字母

数字0-9

标点-_.!~*‘

字符/ & ? @ # ; $ + = % 用于特殊目的。

其他的内容都需要编码,URL默认不进行编码

public class EncoderTester implements ITestOperator{
    public static final String DEFAULT_ENCODE = "UTF-8";
    @Override
    public void startTest() {
        try {
            String str = URLEncoder.encode("This is a + base string 我 吃 饭",DEFAULT_ENCODE);
            TraceLog.i(str);
            str = URLDecoder.decode(str, DEFAULT_ENCODE);
            TraceLog.i(str);
        } catch (UnsupportedEncodingException e) {
            e.printStackTrace();
        }

    }
}
12-28 16:47:20.915 23343-23433/com.joyfulmath.sample.javanetwork I/EncoderTester: startTest: This+is+a+%2B+base+string+%E6%88%91+%E5%90%83+%E9%A5%AD [at (EncoderTester.java:20)]
12-28 16:47:20.916 23343-23433/com.joyfulmath.sample.javanetwork I/EncoderTester: startTest: This is a + base string 我 吃 饭 [at (EncoderTester.java:22)]

如上,空格会编码成+,所以 非给定的字符,都需要编码!

而特殊符号,则需要看情况,确定是否编码!

三.URI

URI是纯字符串的内容,是URL的相对内容。

URI格式分为三部分:

scheme:sheeme-part:fragment

URI top = new URI("http://www.example.com/");
URI relative  = new URI("image/logo.png");
URI resolved = top.resolve(relative);
output:
http://www.example.com/image/logo.png"

URI可以做绝对路径和相对路径的转化,但是URL必须是绝对路径。

时间: 2024-10-08 09:46:42

java网络---再论URL & URI的相关文章

Java网络编程(URL与URLConnection)

//URL package org.urldemo; import java.io.InputStream; import java.net.URL; import java.util.Scanner; public class URLDemo { public static void main(String[] args) throws Exception{ URL url = new URL("http","www.hut.edu.cn",80,"/c

Java网络编程之URL网络编程

一.URL类概述 1.URL(Uniform Resource Locator):统-资源定位符,它表示Internet上某一资源的地址.2.它是一种具体的URI,即URL可以用来标识一个资源,而且还指明了如何locate这个资源.3.通过URL我们可以访问Internet上的各种网络资源,比如最常见的www,ftp站点.浏览器通过解析给定的URL可以在网络上查找相应的文件或其他资源.4.URL的基本结构由5部分组成: 二.URL类构造器1.为了表示URL, java.net 中实现了类URL.

java网络编程2-URL和URI

//创建url可以指定请求的url协议,但不同的jvm支持的协议可能不相同(大部分支持http.file.https) //构造只判断字符串中的协议支不支持,而不判断url的正确性 URL url=new URL("http://www.baidu.com"); System.out.println(url.getProtocol()); System.out.println(url.getHost()); //url中没有指定端口则返回-1 System.out.println(ur

Java网络编程 探险

我们先来看看计算机网络主要功能:资源共享:信息传输和集中处理:负载均衡和分布处理:综合信息服务. 实际上Java的网络编程就是服务器通过ServerSocket建立监听,客户端通过Socket连接到指定服务器后,通信双方就可以通过IO流进行通信了. 1.认识网络编程 计算机网络中实现通信的约定被称为通信协议,通信协议负责对传输速率.传输代码.代码结构.传输控制步骤.出错控制等制定处理标准. 计算机网络的OSI模型(各种计算机网络的参考标准)如下: 1)上层协议 http,ftp,https 2)

java进阶学习 --java网络编程一(转)

Java - 网络编程完全总结(基础介绍) 本文主要是在网络编程方面的学习总结,先主要介绍计算机网络方面的相关内容,包括计算机网络基础,OSI参考模型,TCP/IP协议簇,常见的网络协议等等,在此基础上,主要介绍Java中的网络编程. 目录 一.概述 二.计算机网络 1.网络协议 2.网络体系结构 三.OSI参考模型 四.TCP/IP参考模型 五.常见网络协议 1.TCP协议 2.UDP协议 3.HTTP协议 六.计网常见问题 一.概述 计算机网络是通过传输介质.通信设施和网络通信协议,把分散在

Java网络编程和NIO:Java网络编程基础

转自: https://www.cnblogs.com/midiyu/p/7875574.html 关于网络 网络协议 如同人与人之间相互交流是需要遵循一定的规矩一样,计算机之间能够进行相互通信是因为它们都共同遵守一定的规则,即网络协议. 网络体系结构 计算机网络是个复杂的系统,按照人们解决复杂问题的方法,把计算机网络实现的功能分到不同的层次上,层与层之间用接口连接.通信的双方具有相同的层次,层次实现的功能由协议数据单元(PDU)来描述.不同系统中的同一层构成对等层,对等层之间通过对等层协议进行

Java网络详解

Java网络详解 Java网络基本概念 网络基础知识 1.计算机网络形式多样,内容繁杂.网络上的计算机要互相通信,必须遵循一定的协议.目前使用最广泛的网络协议是Internet上所使用的TCP/IP协议 2.网络编程的目的就是指直接或间接地通过网络协议与其他计算机进行通讯.网络编程中有两个主要的问题,一个是如何准确的定位网络上一台或多台主机,另一个就是找到主机后如何可靠高效的进行数据传输.在TCP/IP协议中IP层主要负责网络主机的定位,数据传输的路由,由IP地址可以唯一地确定Internet上

第13篇-JAVA 网络编程

第13篇-JAVA 网络编程 每篇一句 比我强大的人都在努力我还有什么理由不拼命 初学心得 不去追逐你所渴求你将永远不会拥有 (笔者JEEP/711)[JAVA笔记 | 时间:2017-04-22| JAVA 网络编程 ] 1.网络编程基本概念 1.什么是计算机网络 计算机网络是指将地理位置不同的具有独立功能的多台计算机及其外部设备通过通信线路连接起来在网络操作系统网络管理软件及网络通讯协议的管理和协调下实现资源共享和信息传递的计算机系统 把分布在不同地理区域的计算机与专门的外部设备用通讯线路互

Java网络编程【Socket服务端和客户端】

Socket 编程大家都不陌生,Java 学习中必学的部分,也是 Java网络编程核心内容之一.Java 网络编程又包括 TCP.UDP,URL 等模块.TCP 对应 Socket模块,UDP 对应 DatagramPacket 模块.URL 对应 URL 模块.其中 TCP 和 UDP 是网络传输协议,TCP 是数据流传输协议,UDP 是数据包传输协议.两者之间的异同就不在这里说了,推荐一本入门书籍 <TCPIP入门经典>.我们开始 Socket 服务端和客户端编程吧. 一.Socket 服