客户端协议处理框架
本文为《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; } }
相关推荐
总的来说,Java Socket编程提供了一套完整的网络通信框架,开发者可以通过它实现自定义的通信协议,满足各种复杂场景的需求。在实际开发中,理解并熟练掌握Socket的异常处理、状态检查以及数据传输机制是至关重要的...
#### 标题解析:Java网络编程笔记 在当今数字化时代,网络编程已成为软件开发中不可或缺的一部分,尤其在J2EE(Java 2 Platform, Enterprise Edition)框架下,其重要性更为凸显。J2EE为构建企业级应用提供了强大的...
这份"Java基础笔记"涵盖了初学者需要掌握的关键知识点,旨在帮助快速入门Java编程。以下是对这些笔记内容的详细解读: 1. **Java简介**:Java是由Sun Microsystems(现已被Oracle公司收购)于1995年发布的面向对象...
【Java基础】 Java是一种广泛使用的面向对象的编程语言,由Sun Microsystems(现已被Oracle公司收购)于1995年发布。Java以其“一次编写,到处运行”的特性...通过深入学习和实践,你可以不断提升自己的Java编程能力。
《李兴华Java实战经典笔记》是一份深入探讨Java编程技术的宝贵资料,由知名IT教育专家李兴华编撰。这份笔记集合了他在教学和实践中积累的丰富经验,旨在帮助学习者掌握Java的核心概念、设计模式以及实战技巧。通过这...
本项目名为"Java笔记桌面程序",它是由一个热衷于编程的开发者为解决其所在公司无法使用网络笔记客户端的问题而自创的。这个程序采用Java语言编写,充分体现了Java的跨平台特性,可以在多种操作系统上运行,包括...
Java JDK 6是Java开发工具集的一个重要版本,它为开发者提供了广泛的特性和改进,使得Java编程更加高效和便捷。这份“Java JDK 6学习笔记”涵盖了从基础到高级的各种主题,是Java初学者和进阶者的重要参考资料。以下...
1. **Java编程基础**:包括变量、控制结构、类与对象、继承、接口、异常处理等。 2. **Android开发**:Android Studio的使用,布局设计(XML),Activity和Intent,数据存储(SharedPreferences, SQLite)等。 3. **...
Java编程语言是面向对象的、跨平台的编程语言,由Sun Microsystems(现为Oracle Corporation的一部分)于1995年发布。它以其“一次编写,到处运行”的特性而闻名,这意味着编写好的Java程序可以在任何支持Java的平台...
通过搭建Android客户端与服务器端的通信框架,并利用服务器作为中间件访问MySQL数据库,不仅锻炼了学生的编程实践能力,还帮助他们掌握了网络编程的基本原理和技术要点。此外,该项目还涉及到数据库操作、网络调试等...
要理解Java网络编程,首先要了解计算机网络的基本架构,其中开放系统互连参考模型(OSI)是一个重要的理论框架。 OSI模型是一个七层结构,从下到上分别是物理层、数据链路层、网络层、传输层、会话层、表示层和应用层...
网络编程接口支持TCP和UDP协议,可以创建客户端和服务端应用。 异常处理在Java中扮演着关键角色,它使得程序在遇到错误时能优雅地恢复,而不是突然崩溃。例如,当读取文件时,如果文件不存在,FileInputStream会抛...
总的来说,这个Java网络编程TCP多线程连接例子为我们提供了一个基础的框架,展示了如何使用Java实现可靠的TCP连接,并通过多线程处理并发请求。在深入学习和实践中,我们还可以结合其他Java网络库,如NIO(非阻塞I/O...
6. **java.net 包**:提供了网络编程相关的类,如 `InetAddress` 用于处理 IP 地址,`URL` 用于表示统一资源定位符,以及前面提到的 `ServerSocket`, `Socket`, `DatagramSocket` 和 `DatagramPacket`。 7. **其他...
5. **网络编程**:讲解Socket编程,如何创建客户端和服务器进行网络通信,以及HTTP、HTTPS协议的基本原理。 6. **多线程**:阐述Java中的并发编程,包括线程的创建、同步机制(synchronized、wait/notify、Lock接口...
7. **网络编程**:Java的Socket编程允许创建客户端和服务器应用程序,理解TCP和UDP协议,以及ServerSocket和Socket类的使用。 8. **反射**:反射是Java的一种强大的工具,可以动态地获取类的信息并操作对象。学习...
《Java编程思想》是 Bruce Eckel 的经典著作,这本书深入浅出地讲解了Java语言的核心概念和编程技术。这份读书笔记记录了读者在研读此书过程中的理解和体会,涵盖了从基础语法到高级特性的全面解析。以下是笔记中...
5. **网络编程**:TCP/IP协议的应用,如客户端/服务器模型。 6. **多线程编程**:利用多线程提高程序性能。 #### Java EE基础知识 1. **Java面向对象编程**:与Java SE相似。 2. **数据库编程**:重点在于使用JDBC...
在本文中,我们将围绕Java编程的一些关键知识点进行深入探讨,包括但不限于类、对象、封装、继承、多态等基本概念,以及异常处理、垃圾回收、集合框架、IO流、多线程和网络编程等高级主题。 1. **类与对象**:Java...
”可能是在强调学习Java时的积极进取态度,而“java_go_over”和“javaover”可能是学习笔记或者项目的名称,旨在回顾和总结Java编程的知识。 在描述中,“自我java编程复习,随时更新”表明这是一份个人的Java编程...