1|0概述
Java 对客户程序的通信过程进行了抽象,提供了通用的协议处理框架,该框架封装了 Socket,主要包括以下类:
- URL 类:统一资源定位符,表示客户程序要访问的远程资源
- URLConnection 类:表示客户程序与远程服务器的连接,客户程序可以从 URLConnection 获得数据输入流和输出流
- URLStreamHandler 类:协议处理器,主要负责创建与协议相关的 URLConnection 对象
- ContentHandler 类:内容处理器,负责解析服务器发送的数据,把它转换为相应的 Java 对象
以上类都位于 java.net 包,除 URL 类为具体类,其余的都是抽象类,对于一种具体的协议,需要创建相应的具体子类。Oracle 公司为协议处理框架提供了基于 HTTP 的实现,它们都位于 JDK 类库的 sun.net.www 包或者其子包
2|0URL 类的用法
下例的 HtpClient 类利用 URL 类创建了一个简单的 HTTP 客户程序,先创建了一个 URL 对象,然后通过它的 openStream()
方法获得一个输入流,接下来就从这个输入流中读取服务器发送的响应结果
URL 类的构造方法创建 URLStreamHandler 实例的流程如下:
-
如果在 URL 缓存已经存在这样的
URLStreamHandler
实例,则无须再创建,否则继续执行下一步 -
如果程序通过 URL 类的静态
setURLStreamHandlerFactory()
方法设置了URLStreamHandlerFactory
接口的具体实现类,那么就通过这个工厂类的createURLStreamHandler()
方法来构造URLStreamHandler
实例,否则继续执行下一步 -
根据系统属性
java.prolocol.handler.pkgs
来决定URLStreamHandler
具体子类的名字,然后对其实例化,假定运行 HttpClient 的命令为:以上命令中的 -D 选项设定系统属性,会先查找并试图实例化
com.abc.net.www.http.Handler
类,如果失败,再试图实例化net.javathinkerprotocols.http.Handler
类,如果以上操作都失败,那么继续执行下一步 -
试图实例化位于
sun.net.www.prolocol
包的sun.netwww.protocol.协议名.Handler
类,如果失败,URL 构造方法就会抛出 MalforedURLException。在本例协议名是 http,会试图实例化sun.net.www.protocol.http.Handler
类
URL 类具有以下方法:
openConnection()
:创建并返回一个URLConnection
对象,这个openConnection()
方法实际上是通过调用URLStreamHandler
类的openConnection()
方法,来创建URLConnection
对象openStream()
:返回用于读取服务器发送数据的输入流,该方法实际上通过调用URLConnection
类的getInputStream()
方法来获得输入流getContent()
:返回包装了服务器发送数据的 Java 对象,该方法实际上调用URLConnection
类的getContent)
方法,而URLConnection
类的getContent()
方法又调用了ContentHandler
类的getContent()
方法
3|0URLConnection 类的用法
URLConnection 类表示客户程序与远程服务器的连接,URLConnection 有两个 boolean 类型的属性以及相应的 get 和 set 方法:
- dolnput:如果取值为 true,表示允许获得输入流,读取远程服务器发送的数据该属性的默认值为 true。程序可通过 getDolnput() 和 setDolnput() 方法来读取和设置该属性
- doOutput:如果取值为 true,表示允许获得输出流,向远程服务器发送数据该属性的默认值为 false。程序可通过 getDoOutput() 和 setDoOutput() 方法来读取和设置该属性
URLConnection 类提供了读取远程服务器的响应数据的一系列方法:
getHeaderField(String name)
:返回响应头中参数 name 指定的属性的值getContentType()
:返回响应正文的类型,如果无法获取响应正文的类型就返回 nullgetContentLength()
:返回响应正文的长度,如果无法获取响应正文的长度,就返回 -1getContentEncoding()
:返回响应正文的编码类型,如果无法获取响应正文的编码类型,就返回 null
下例的 HtpClient 类利用 URLConnection 类来读取服务器的响应结果
4|0实现协议处理框架
本节将为用户自定义的 ECHO 协议实现处理框架,共创建了以下类:
- EchoURLConnection 类:继承自 URLConnection 类
- EchoURLStreamHandler 类:继承自 URLStreamHandler 类
- EchoURLStreamHandlerFactory 类:实现 URLStreamHandlerFactory 接口
- EchoContentHandler 类:继承自 ContentHandler 类
- EchoContentHandlerFactory 类:实现 ContentHandlerFactory 接口
1. 创建 EchoURLConnection 类
EchoURLConnection 类封装了一个 Socket,在 connect() 方法中创建与远程服务器连接的 Socket 对象
2. 创建 EchoURLStreamHandler 及工厂类
EchoURLStreamHandler 类的 openConnection()
方法负责创建一个 EchoURLConnection 对象
EchoURLStreamHandlerFactory 类的 createURLStreamHandle()
方法负责构造 EchoURLStreamHandler 实例
在客户程序中,可以通过以下方式设置 EchoURLStreamHandlerFactory
3. 创建 EchoContentHandler 类及工厂类
URLConnection 类还提供了 getContent()
方法,它有两种重载形式:
第二个 getContent() 方法把服务器发送的数据优先转换为 classes 数组第一个元素指定的类型,如果转换失败,再尝试转换第二个元素指定的类型,以此类推
下例 HttpClient 演示处理服务器发送的数据
EchoContentHandler 类负责处理 EchoServer 服务器发送的数据
第二个 getContent() 方法依次遍历 classes 参数中的元素,判断元素是否为 InputSuream 类型或 String 类型,如果是,就返回相应类型的对象,它包含了服务器发送的数据。如果 classes 参数中的元素都不是 InputStream 类型或 String 类型,就返回 null
EchoContentHandlerFactory 类的 createContentHandler() 方法负责创建一个EchoContentHandler 对象
在客户程序中,可以通过以下方式设置 EchoContentHandlerFactory
4. 在 EchoClient 类运用 ECHO 协议处理框架
__EOF__

本文链接:https://www.cnblogs.com/Yee-Q/p/17453172.html
关于博主:评论和私信会在第一时间回复。或者直接私信我。
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
声援博主:如果您觉得文章对您有帮助,可以点击文章右下角【推荐】一下。您的鼓励是博主的最大动力!