• 一致资源定位器URL

URL(Uniform Resource Locator)是一致资源定位器的简称,它表示Internet上某一资源的地址。通过URL我们可以访问Internet上的各种网络资源,比如最常见的WWW,FTP站点。浏览器通过解析给定的URL可以在网络上查找相应的文件或其他资源。

  • URL的组成

protocol://resourceName

协议名(protocol)指明获取资源所使用的传输协议,如http、ftp、gopher、file等,资源名(resourceName)则应该是资源的完整地址,包括主机名、端口号、文件名或文件内部的一个引用。例如:


http://www.sun.com/ 协议名://主机名 http://home.netscape.com/home/welcome.html 协议名://机器名+文件名 http://www.gamelan.com:80/Gamelan/network.html#BOTTOM 协议名://机器名+端口号+文件名+内部引用。
  • 创建一个URL

为了表示URL, java.net中实现了类URL。我们可以通过下面的构造方法来初始化一个URL对象:

(1) public URL (String spec);

通过一个表示URL地址的字符串可以构造一个URL对象。


URL urlBase=new URL("http://www. 263.net/")

(2) public URL(URL context, String spec);

通过基URL和相对URL构造一个URL对象。


URL net263=new URL ("http://www.263.net/"); URL index263=new URL(net263, "index.html")

(3) public URL(String protocol, String host, String file);


new URL("http", "www.gamelan.com", "/pages/Gamelan.net. html");

(4) public URL(String protocol, String host, int port, String file);


URL gamelan=new URL("http", "www.gamelan.com", 80, "Pages/Gamelan.network.html");

注意:类URL的构造方法都声明抛弃非运行时例外(MalformedURLException),因此生成URL对象时,我们必须要对这一例外进行处理,通常是用try-catch语句进行捕获。格式如下:


try{     URL myURL= new URL(…)   }catch (MalformedURLException e){   …  }
  • 解析一个URL

一个URL对象生成后,其属性是不能被改变的,但是我们可以通过类URL所提供的方法来获取这些属性:


public String getProtocol() 获取该URL的协议名。 public String getHost() 获取该URL的主机名。 public int getPort() 获取该URL的端口号,如果没有设置端口,返回-1。 public String getFile() 获取该URL的文件名。 public String getRef() 获取该URL在文件中的相对位置。 public String getQuery() 获取该URL的查询信息。 public String getPath() 获取该URL的路径。 public String getAuthority() 获取该URL的权限信息。 public String getUserInfo() 获得使用者的信息。 public String getRef() 获得该URL的锚。
  • 从URL读取WWW网络资源

当我们得到一个URL对象后,就可以通过它读取指定的WWW资源。这时我们将使用URL的方法openStream(),其定义为:


InputStream openStream();

方法openSteam()与指定的URL建立连接并返回InputStream类的对象以从这一连接中读取数据。


public class URLReader {   public static void main(String[] args) throws Exception {                       //声明抛出所有例外     URL tirc = new URL("http://www.tirc1.cs.tsinghua.edu.cn/");                       //构建一URL对象     BufferedReader in = new BufferedReader(new InputStreamReader(tirc.openStream()));     //使用openStream得到一输入流并由此构造一个BufferedReader对象     String inputLine;     while ((inputLine = in.readLine()) != null)                  //从输入流不断的读数据,直到读完为止        System.out.println(inputLine); //把读入的数据打印到屏幕上     in.close(); //关闭输入流   } }
  • 通过URLConnetction连接WWW

通过URL的方法openStream(),我们只能从网络上读取数据,如果我们同时还想输出数据,例如向服务器端的CGI程序发送一些数据,我们必须先与URL建立连接,然后才能对其进行读写,这时就要用到类URLConnection了。CGI是公共网关接口(Common Gateway Interface)的简称,它是用户浏览器和服务器端的应用程序进行连接的接口,有关CGI程序设计,请读者参考有关书籍。

类URLConnection也在包java.net中定义,它表示Java程序和URL在网络上的通信连接。当与一个URL建立连接时,首先要在一个URL对象上通过方法openConnection()生成对应的URLConnection对象。例如下面的程序段首先生成一个指向地址http://edu.chinaren.com/index.shtml的对象,然后用openConnection()打开该URL对象上的一个连接,返回一个URLConnection对象。如果连接过程失败,将产生IOException.


  Try{     URL netchinaren = new URL ("http://edu.chinaren.com/index.shtml");     URLConnectonn tc = netchinaren.openConnection();   }catch(MalformedURLException e){ //创建URL()对象失败   …   }catch (IOException e){ //openConnection()失败   …   }

类URLConnection提供了很多方法来设置或获取连接参数,程序设计时最常使用的是getInputStream()和getOurputStream(),其定义为:


InputSteram getInputSteram(); OutputSteram getOutputStream();

通过返回的输入/输出流我们可以与远程对象进行通信。看下面的例子:


  URL url =new URL ("http://www.javasoft.com/cgi-bin/backwards");   //创建一URL对象   URLConnectin con=url.openConnection();   //由URL对象获取URLConnection对象   DataInputStream dis=new DataInputStream (con.getInputSteam());   //由URLConnection获取输入流,并构造DataInputStream对象   PrintStream ps=new PrintSteam(con.getOutupSteam());   //由URLConnection获取输出流,并构造PrintStream对象   String line=dis.readLine(); //从服务器读入一行   ps.println("client…"); //向服务器写出字符串 "client…"

其中backwards为服务器端的CGI程序。实际上,类URL的方法openSteam()是通过URLConnection来实现的。它等价于


openConnection().getInputStream();

基于URL的网络编程在底层其实还是基于下面要讲的Socket接口的。WWW,FTP等标准化的网络服务都是基于TCP协议的,所以本质上讲URL编程也是基于TCP的一种应用。

基于URL的高层次Java网络编程的更多相关文章

  1. 基于Socket的低层次Java网络编程

    Socket通讯 网络上的两个程序通过一个双向的通讯连接实现数据的交换,这个双向链路的一端称为一个Socket.Socket通常用来实现客户方和服务方的连接.Socket是TCP/IP协议的一个十分流 ...

  2. AJPFX总结Socket的低层次Java网络编程

    Socket的低层次Java网络编程 1 Socket通讯 网络上的两个程序通过一个双向的通讯连接实现数据的交换,这个双向链路的一端称为一个Socket.Socket通常用来实现客户方和服务方的连接. ...

  3. Java网络编程和NIO详解9:基于NIO的网络编程框架Netty

    Java网络编程和NIO详解9:基于NIO的网络编程框架Netty 转自https://sylvanassun.github.io/2017/11/30/2017-11-30-netty_introd ...

  4. Java 网络编程 -- 基于TCP 模拟多用户登录

    Java TCP的基本操作参考前一篇:Java 网络编程 – 基于TCP实现文件上传 实现多用户操作之前先实现以下单用户操作,假设目前有一个用户: 账号:zs 密码:123 服务端: public c ...

  5. Java网络编程探究|乐字节

    大家好,我是乐字节小乐,上次给大家讲述了Java中的IO流之输出流|乐字节,本文将会给大家讲述网络编程. 主要内容如下: 网络 网络分层 IP位置 端口port 网络编程 一. 网络 1.概念 网络即 ...

  6. java网络编程socket解析

    转载:http://www.blogjava.net/landon/archive/2013/07/02/401137.html Java网络编程精解笔记2:Socket详解 Socket用法详解 在 ...

  7. Java - 网络编程完全总结

    本文主要是自己在网络编程方面的学习总结,先主要介绍计算机网络方面的相关内容,包括计算机网络基础,OSI参考模型,TCP/IP协议簇,常见的网络协议等等,在此基础上,介绍Java中的网络编程. 一.概述 ...

  8. 【转载】Java 网络编程

      本文主要是自己在网络编程方面的学习总结,先主要介绍计算机网络方面的相关内容,包括计算机网络基础,OSI参考模型,TCP/IP协议簇,常见的网络协议等等,在此基础上,介绍Java中的网络编程. 一. ...

  9. 【Android实战】----从Retrofit源代码分析到Java网络编程以及HTTP权威指南想到的

    一.简单介绍 接上一篇[Android实战]----基于Retrofit实现多图片/文件.图文上传中曾说非常想搞明确为什么Retrofit那么屌. 近期也看了一些其源代码分析的文章以及亲自查看了源代码 ...

随机推荐

  1. Java将list数据导出到Excel——(八)

    Java实体类 package bean; public class Question { private String timu; //题干 private String leixing; //类型 ...

  2. pl/sql Devloper 关键字转为大写

    英文版: peferences-editor-keyword case -uppercase   中文版:

  3. Python爬虫-爬取糗事百科段子

    闲来无事,学学python爬虫. 在正式学爬虫前,简单学习了下HTML和CSS,了解了网页的基本结构后,更加快速入门. 1.获取糗事百科url http://www.qiushibaike.com/h ...

  4. Linux Kernel 代码艺术——编译时断言【转】

    转自:http://www.cnblogs.com/hazir/p/static_assert_macro.html 本系列文章主要写我在阅读Linux内核过程中,关注的比较难以理解但又设计巧妙的代码 ...

  5. concat layer

    参考:http://blog.csdn.net/bailufeiyan/article/details/50876728#reply

  6. Redis五大数据类型以及操作

    目录: 一.redis的两种链接方式 二.redis的字符串操作(string) 三.redis的列表操作(list) 四.redis的散列表操作(类似于字典里面嵌套字典) 五.redis的集合操作( ...

  7. Deep Learning系统实训之二:梯度下降原理

    基本概念理解: 一个epoch:当前所有数据都跑(迭代)了一遍: 那么两个epoch,就是把所有数据跑了两遍,三个epoch就是把所有数据跑了三遍,以此类推. batch_size:每次迭代多少个数据 ...

  8. ECLIPSE 导入外部文件或源码包

    步骤: 点击Project->Properties->Libraries->Add External Class Folder.. ->选择你的文件路径->确定 注:如果 ...

  9. python 全栈开发,Day63(子查询,MySQl创建用户和授权,可视化工具Navicat的使用,pymysql模块的使用)

    昨日内容回顾 外键的变种三种关系: 多对一: 左表的多 对右表一 成立 左边的一 对右表多 不成立 foreign key(从表的id) refreences 主表的(id) 多对多 建立第三张表(f ...

  10. 分布式任务调度系统xxl-job搭建(基于docker)

    一.简介 XXL-JOB是一个轻量级分布式任务调度平台,其核心设计目标是开发迅速.学习简单.轻量级.易扩展.现已开放源代码并接入多家公司线上产品线,开箱即用. 更多介绍,请访问官网: http://w ...