Java 网络编程 —— 客户端协议处理框架

本文介绍了Java网络编程中如何实现一个自定义的协议处理框架,包括URL类、URLConnection类的使用,以及如何创建EchoURLConnection、EchoURLStreamHandler、EchoContentHandler等类来处理ECHO协议。通过这个框架,可以实现与远程服务器的连接和数据交换。
摘要由CSDN通过智能技术生成

1.0 概念

Java 对客户程序的通信过程进行了抽象,提供了通用的协议处理框架,该框架封装了 Socket,主要包括以下类:

  • URL 类:统一资源定位符,表示客户程序要访问的远程资源

  • URLConnection 类:表示客户程序与远程服务器的连接,客户程序可以从 URLConnection 获得数据输入流和输出流

  • URLStreamHandler 类:协议处理器,主要负责创建与协议相关的 URLConnection 对象

  • ContentHandler 类:内容处理器,负责解析服务器发送的数据,把它转换为相应的 Java 对象

以上类都位于 java.net 包,除 URL 类为具体类,其余的都是抽象类,对于一种具体的协议,需要创建相应的具体子类。Oracle 公司为协议处理框架提供了基于 HTTP 的实现,它们都位于 JDK 类库的 sun.net.www 包或者其子包

2.0 URL类的用法

下例的 HtpClient 类利用 URL 类创建了一个简单的 HTTP 客户程序,先创建了一个 URL 对象,然后通过它的 openStream() 方法获得一个输入流,接下来就从这个输入流中读取服务器发送的响应结果

public class HttpClient {
    
    public static void main(String args[]) throws IOException {
        //http是协议符号
        URI url = new URL("http://www.javathinker.net/hello.htm");
        //接收响应结果
        InputStream in = url.openStream();
        ByteArrayOutputStream buffer = new ByteArrayOutputStream();
        bytel] buff = new byte[1024];
        int len = -l;
        
        while((len = in.read(buff)) != -1) {
            buffer.write(buff, 0, len);
        }
        //把字节数组转换为字符串
        System.out.println(new String(buffer.toByteArray()));
    }
}

URL 类的构造方法创建 URLStreamHandler 实例的流程如下:

  1. 如果在 URL 缓存已经存在这样的 URLStreamHandler 实例,则无须再创建,否则继续执行下一步

  2. 如果程序通过 URL 类的静态 setURLStreamHandlerFactory() 方法设置了 URLStreamHandlerFactory 接口的具体实现类,那么就通过这个工厂类的 createURLStreamHandler() 方法来构造 URLStreamHandler 实例,否则继续执行下一步

  3. 根据系统属性 java.prolocol.handler.pkgs 来决定 URLStreamHandler 具体子类的名字,然后对其实例化,假定运行 HttpClient 的命令为:

java -Djava.protocol.handler.pkgs=com.abc.net.www | net.javathinker.protocols HttpClient

4.以上命令中的 -D 选项设定系统属性,会先查找并试图实例化 com.abc.net.www.http.Handler 类,如果失败,再试图实例化 net.javathinkerprotocols.http.Handler 类,如果以上操作都失败,那么继续执行下一步

5.试图实例化位于 sun.net.www.prolocol 包的 sun.netwww.protocol.协议名.Handler 类,如果失败,URL 构造方法就会抛出 MalforedURLException。在本例协议名是 http࿰

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值