`

Java网络编程笔记_客户端协议处理框架

 
阅读更多

客户端协议处理框架

 

本文为《Java网络编程精解》客户端协议处理框架这一章的一些学习笔记。

Java对客户程序的通讯过程进行了抽象,提供了通用的协议处理框架,这个框架的优点在与能够封装Socket与服务器通信的细节,在客户程序中一般只需要访问URL和URLConnection类,就能够完成与服务器的通信,框架的具体实现对客户程序是透明的。

作为协议处理框架的实现程序,通常要实现基于特定协议的URLConenction、URLStreamHandler和ContentHandler类的具体子类,此外还要创建URLStreamHandler和ContentHandler类的工厂类,他们负责创建URLStreamHandler和ContentHandler类的具体子类的实力

框架图:

 

实现协议处理框架

  • EchoURLConnection类:继承自URLConnection类
  • EchoURLStreamHandler类:继承自URLStreamHandler类
  • EchoURLStreamHandlerFactory类:实现了URLStreamHandlerFactory接口
  • EchoContentHandler:继承自ContentHandler类
  • EchoContentHandlerFactory:实现ContentHandlerFactory接口

 

创建EchoURLConnection类

EchoURLConnection类实现了connect(),getContentType(),getInputStream()和getOutputStream()方法。EchoURLConnection类封装了一个Socket,在connect()方法中创建与远程服务器连接的Socket对象

package urlFramwork;

import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.Socket;
import java.net.URL;
import java.net.URLConnection;

/**
 * URLConnection子类,理解为某协议与服务器之间的连接
 * @author xusy
 *
 */
public class EchoURLConnection extends URLConnection {
	private Socket connection;
	public static final int DEFAULT_PORT = 8000;

	protected EchoURLConnection(URL url) {
		super(url);
	}

	/* 
	 * 连接服务器
	 */
	@Override
	public void connect() throws IOException {
		//TODO 创建与服务器之间的连接
		if (!connected) {
			int port = url.getPort();
			if (port < 0 || port > 65535)
				port = DEFAULT_PORT;
			connection = new Socket(url.getHost(), port);
			this.connected = true;
		}
	}
	
	/**
	 * 断开服务器
	 */
	public void disconnect() throws IOException{
		if(connected){
			connection.close();
			this.connected = false;
		}
	}

	/* 
	 * 当与服务器建立起连接后,获得InputStream
	 */
	public synchronized InputStream getInputStream() throws IOException {
		if (!connected)
			connect();
		return connection.getInputStream();
	}

	/* 
	 * * 当与服务器建立起连接后,获得OutputStream
	 */
	public synchronized OutputStream getOutputStream() throws IOException { 
		if (!connected)
			connect();
		return connection.getOutputStream();

	}
	
	public String getContentType(){
		return "text/plain";
	}

}

 

 

 创建EchoURLStreamHandler 类和工厂

EchoURLStreamHandler 协议处理器,主要负责创建与协议相关的URLConnection对象,EchoURLStreamHandler类的openConnection()方法负责创建一个EchoURLConenction对象。URL类的openConnection()方法会调用EchoURLStreamHandler类的openConnection()方法。

package urlFramwork;

import java.io.IOException;
import java.net.URL;
import java.net.URLConnection;
import java.net.URLStreamHandler;

/**
 * 负责创建EchoURLConnection对象,URL类的openConnection()方法会调用EchoURLStreamHandler类的openConnection()方法。
 * @author xusy
 *
 */
public class EchoURLStreamHandler extends URLStreamHandler {
	
	@Override
	protected URLConnection openConnection(URL u) throws IOException {
		return new EchoURLConnection(u);
	}

}

 

EchoURLStreamHandler的工厂类 

 

package urlFramwork;

import java.net.URLStreamHandler;
import java.net.URLStreamHandlerFactory;

/**
 *负责创建 EchoURLStreamHandler的工厂类
 * @author xusy
 *
 */
public class EchoURLStreamHandlerFactory implements URLStreamHandlerFactory {

	@Override
	public URLStreamHandler createURLStreamHandler(String protocol) {
		if (protocol.equals("echo"))
			return new EchoURLStreamHandler();
		return null;
	}

}

 

 



  创建EchoContentHandler类和工厂类

对于服务器发送的数据,客户程序可通过URLConnection类的getInputStream()方法获得输入流,然后读取数据,此外URLConnection类还提供了getContent()方法,

它有两种重载形式:

1)public Object getContent()

2) public Object getContent(Class[] classes)

第一个getContent()方法能把服务器发送的数据转换成一个Java对象。第二个getContent()方法的classes参数制定了转换而成的Java对象的类型,getContent()方法把服务器发送的数据优先转换成classes数组中

第一个元素制定的类型,如果转换失败,则尝试转换为classes数组中第二个元素的类型,依次类推。URLConnection类的getContent()方法会调用ContentHandler类的相应的getContent()方法。

在客户端程序中,可以通过一下方式处理服务器发送的数据

URL url = new URL("www.googel.com");

URLConnection connection = url.openConnection();

Class[] classes = {String.class,InputStream.class};

Object o = connection.getContent(classes);

if(o instanceof String){

System.out.prinltn(0)

}else if(o instanceof InputStream){

InputStream in=(InputStream)o;

//处理输入流...

}else{

System.out.println("无法识别服务器发送的数据");

}

 

package urlFramwork;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.ContentHandler;
import java.net.URLConnection;

/**
 * @author xusy
 *
 */
/**
 * @author xusy
 *
 */
public class EchoContentHandler extends ContentHandler {

	/*
	 * 读取服务器发送的一行数据,把它转换为字符串对象
	 */
	@Override
	public Object getContent(URLConnection connection) throws IOException {
		InputStream in = connection.getInputStream();
		BufferedReader reader = new BufferedReader(new InputStreamReader(in));
		return reader.readLine();
	}


	/* 
	 * 根据参数classes,将服务器传输来的数据转换为对象并返回
	 * @see java.net.ContentHandler#getContent(java.net.URLConnection, java.lang.Class[])
	 */
	public Object getContent(URLConnection connection, Class[] classes)
			throws IOException {
		InputStream inputStream = connection.getInputStream();
		for (int i = 0; i < classes.length; i++) {
			if (classes[i] == InputStream.class)
				return inputStream;
			else if (classes[i] == String.class)
				return getContent(connection);
		}
		return null;
	}

}

 

 

 

 在客户端程序中,可通过URLConnection类的静态setContetHandlerFactory()方法来设置EchoContentHandlerFactory:

//设置ContentHandlerFactory

URLConnection.setContentHandlerFactory(new EchoContentHandlerFactory());

URL url = new URL("echo://localhost:8000");

EchoURLConnection connection = (EchoURLConenction)url.openConnection();

...

//读取服务器返回的数据,它被包装为一个字符串对象

String echoMsg = (String)connection.getContent();

package urlFramwork;

import java.net.ContentHandler;
import java.net.ContentHandlerFactory;

public class EchoContentHandlerFactory implements ContentHandlerFactory {

	@Override
	public ContentHandler createContentHandler(String mimetype) {
		if(mimetype.equals("text/plain"))
			return new EchoContentHandler();
		else
			return null;
	}

}

 

 

  • 大小: 49.1 KB
分享到:
评论

相关推荐

    java面试笔试题库java学习笔记开发教程互联网公司面试资料大全合集.zip

    JAVA编程题全集(100题及答案).doc java面试书籍源码 Java面试笔试题库.CHM Java面试问题集.pdf Java面试题以及答案(小生).pdf java面试题(题库全).doc JS 数据库答案.doc Land.the.Tech.Job.You.Love-人人都有好...

    java面试笔试题库java软件设计java笔试题大集合及答案文档资料合集300MB.zip

    JAVA编程题全集(100题及答案).doc java面试书籍源码 Java面试文档题库 Java面试笔试题库.CHM Java面试问题集.pdf Java面试题以及答案(小生).pdf java面试题(题库全).doc JS 数据库答案.doc Land.the.Tech.Job.You....

    java课堂笔记总.docx

    Java课程是一种教授学生如何使用Java编程语言的学习课程。Java是一种通用编程语言,广泛用于开发各种类型的应用程序,包括桌面应用程序、移动应用程序、Web应用程序和后端服务器等。 Java课程通常包括以下内容: ...

    Java并发编程(学习笔记).xmind

    Java并发编程 背景介绍 并发历史 必要性 进程 资源分配的最小单位 线程 CPU调度的最小单位 线程的优势 (1)如果设计正确,多线程程序可以通过提高处理器资源的利用率来提升系统吞吐率 ...

    java面试笔试资料java笔试题大集合及答案题库java笔试题汇总资料188个合集.zip

    JAVA编程题全集(100题及答案).doc Java面试文档题库 Java面试笔试题库.CHM java面试笔试题库资料合集.zip Java面试问题集.pdf Java面试题以及答案(小生).pdf java面试题(题库全).doc JS 数据库答案.doc Land.the....

    学习笔记,hibernate框架入门

    它对JDBC进行了非常轻量级的对象封装,它将POJO与数据库表建立映射关系,是一个全自动的orm框架,hibernate可以自动生成SQL语句,自动执行,使得Java程序员可以随心所欲的使用对象编程思维来操纵数据库。 Hibernate...

    hibernate_上课笔记.zip

    它对JDBC进行了非常轻量级的对象封装,它将POJO与数据库表建立映射关系,是一个全自动的orm框架,hibernate可以自动生成SQL语句,自动执行,使得Java程序员可以随心所欲的使用对象编程思维来操纵数据库。 Hibernate...

    Netty应用说明笔记

    2、直接使用NIO需要需要额外的技能,例如Java多线程,网络编程; 3、要编写一个可靠的、易维护的、高性能的NIO服务器应用。除了框架本身要兼容实现各类操作系统的实现外。更重要的是它应该还要处理很多上层特有服务...

    Java基础、JavaEE框架学习思维导图

    Java基础、JavaEE思维导图:01.Java程序设计基础、02.Java程序设计(专题)、03.客户端网页编程、04.Java Web表示层技术、05.Oracle、06.Hibernate、07.MyBATIS、08.Spring

    Lucene全文检索框架+Solr+ElasticSearch搜索引擎(Java高级必备.ES)

    课程提供所有代码笔记素材以及答疑 1、Lucene框架的熟练应用实现类似百度、京东商城等应用的全文检索效果; 1、Solr简介 2、Solr下载安装以及目录结构介绍 3、Solr应用部署至Tomcat服务器 4、Solr后台管理界面...

    hibernate 笔记

    hibernate 笔记 Hibernate是一个开放源代码的对象关系映射框架,它对JDBC进行了非常轻量级的对象封装,使得Java程序员可以随心所欲的使用对象编程思维来操纵数据库。 Hibernate可以应用在任何使用JDBC的场合,既可以...

    hibernate学习笔记

    Hibernate是一个开放源代码的对象关系映射框架,它对JDBC进行了非常轻量级的对象封装,使得Java程序员可以随心所欲的使用对象编程思维来操纵数据库。 Hibernate可以应用在任何使用JDBC的场合,既可以在Java的客户端...

    Hibernate3笔记个人记录

    Hibernate是一个开放源代码的对象关系映射框架,它对JDBC进行了非常轻量级的对象封装,使得Java程序员可以随心所欲的使用对象编程思维来操纵数据库。 Hibernate可以应用在任何使用JDBC的场合,既可以在Java的客户端...

    Hibernate学习笔记(1)

    Hibernate是一个开放源代码的对象关系映射框架,它对JDBC进行了非常轻量级的对象封装,使得Java程序员可以随心所欲的使用对象编程思维来操纵数据库。 Hibernate可以应用在任何使用JDBC的场合,既可以在Java的客户端...

    Hibernate学习笔记(2)

    Hibernate是一个开放源代码的对象关系映射框架,它对JDBC进行了非常轻量级的对象封装,使得Java程序员可以随心所欲的使用对象编程思维来操纵数据库。 Hibernate可以应用在任何使用JDBC的场合,既可以在Java的客户端...

    Hibernate学习笔记(3)

    Hibernate是一个开放源代码的对象关系映射框架,它对JDBC进行了非常轻量级的对象封装,使得Java程序员可以随心所欲的使用对象编程思维来操纵数据库。 Hibernate可以应用在任何使用JDBC的场合,既可以在Java的客户端...

    Android-App-Architecture-MVVM-Databinding:一个简单但完整的项目(使用Java和Kotlin),以演示带有MVVM模式的Android应用程序体系结构,该模式是The Movie DB Web API的客户端应用程序。 Dagger2用于依赖项注入,RxJava用于RFP(React性功能编程)

    Android App Architecture演示-带有数据绑定的MVVM(Java版)[ ] [] 这是一个示例项目,用于演示具有MVVM模式的Android应用程序体系结构,该模式是 Web API的简单客户端。 注意:如果您想运行该应用程序,则需要一...

    Hibernate学习笔记

    Hibernate是一个开放源代码的对象关系映射框架,它对JDBC进行了非常轻量级的对象封装,使得Java程序员可以随心所欲的使用对象编程思维来操纵数据库。 Hibernate可以应用在任何使用JDBC的场合,既可以在Java的客户端...

    FindMyStuff:这是作为编程实践课程(2015 年冬季)的课程项目构建的 FindMyStuff 应用程序的存储库

    技术栈: 安卓(客户端) 改造(用于从客户端发送 post/get 请求) Spring MVC(在服务器端开发 Rest Api 的框架) MySQL(用于数据库) Jackson(用于数据编组和解组) Java Mail Api(用于从服务器端发送邮件) ...

    asp.net知识库

    在ASP.NET页面中推荐使用覆写(Override)而不是事件处理(Event Handler) 常用编码工具类,支持base64,md5,des,crc32 也谈谈技术面试 在C#里把ArrayList转换为Array 或 把Array转换为ArrayList C# 2.0 在.NET 2.0中...

Global site tag (gtag.js) - Google Analytics