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;
	}

}

 

 

相关推荐

Java网络编程:UDP服务器与客户端实现详解

UDP(User Datagram Protocol)协议,即用户数据报协议,是一种无连接的、不可靠的网络传输协议。与TCP协议相比,UDP以其简单、高效的特点,在某些特定场景下非常适用,如视频流、在线游戏和语音通话等。尽管UDP不保证数据的完整性和顺序性,它却能减少数据传输的延迟,这对需要实时通信的应用至关重要。Java作为一门跨平台、面向对象的编程语言,其在网络编程方面提供了丰富的API来支持开发者进行网络通信的开发。Java网络编程模型的灵活性与多线程支持,使其成为开发网络应用的首选语言之一。

weixin_42174098的博客 877

java基础-网络编程

一.网络编程的基础知识 1。IP协议是一种重要的通讯协议,支持网络间的数据报协议,提供网间连接的完善的功能,包括IP数据报规定互联网络范围内的地址格式。 2。TCP协议:传输控制协议,它规定一种可靠的数据信息传递服务 IP地址和端口号 1。IP地址用于唯一标识网络中一个通信实体。ip地址是数字型的,是一个32位整数,为了便于记忆,将它划分为4个8位的二进制数,每8位之间用圆点分隔,...

轻松qinsong 233

smooks java报文转化框架

smooks是一种强大的java数据转换框架。一些xml报文你可能需要装换其标签头,或者把标签的属性转换成元素,或者想把csv格式的文件转换成xml格式,smooks框架是你的选择。

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

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

woaimx_1314的博客 262

JAVA通信协议框架Darks Codec 1.0.3

Darks Codec是一个轻量级高效的通信消息协议编解码框架。它支持将JAVA对象与绝大部分基于字节的消息协议之间进行互相转换,以此协助开发人员便捷有效的快速构建消息协议,并为粘包、断包等问题提供了有效的解决方案。它能让开发人员从消息协议的实现中解脱出来,让其更多的关注于消息通信协议的设计及优化,以便让软件消息通信的整体设计更加完善。 项目开源地址:https://github.com/liulhdarks/darks-codec 项目发布地址:https://github.com/liulhdarks/darks-codec/releases

Nexus3国内高速下载指南:多版本全平台资源汇总

本文针对国内开发者从官网下载Nexus 3速度慢、易失败的问题,提供了详尽的解决方案。汇总了Windows、Linux、macOS等多个平台的Nexus 3历史及最新版本(如3.31.1)的国内高速下载链接,并附有版本选择建议与Linux环境下的快速启动指南,帮助用户高效获取和部署这一流行的仓库管理工具。

jwt8token的博客 432

Java--URLConnection--使用/实例

本文用示例介绍Java的网络类:URLConnection

IT利刃出鞘的博客 1319

【ROS学习笔记】13.ROS中的坐标管理系统

文章目录1 机器人中的坐标变换2 TF功能包TF坐标变换如何实现?TF的一个小案例3 小程序:小海龟跟随实验打开小程序查看当前的TF树坐标相对位置关系可视化1(tf_echo)坐标相对位置关系可视化2(rviz) 本节学习ROS中的坐标管理系统。 (部分图摘自:b站【古月居】古月·ROS入门21讲) 1 机器人中的坐标变换 机器人运动学的核心,描述任意两个坐标系之中任意两个向量之间的变换,可以用一个4×4的变换矩阵(Transformation Matrices)来描述它的平移和旋转变化。 变换矩阵中有包括

takedachia的博客 4338

URL 源码分析

需要了解的知识点: URI、 URL 和 URN 的区别 URI 源码分析URL 和URI的最大区别是: URL可以定位到一个资源,也就是说,URL类可以访问URL指定的资源信息。 URI只是标识一个对象,所以URI类无法获取URI标识的对象。下面通过源码来分析URL类的实现细节:构造public URL(String spec); public URL(String protocol, S

jijianshuai的专栏 3369

华为防火墙NAT避坑指南:当双ISP出口遇到服务器发布,这些细节不注意会翻车

本文深入解析华为防火墙在双ISP出口环境下服务器发布的实战配置,重点探讨no-reverse参数对Server-Map表的影响、源进源出功能的实现及线路切换时的会话保持问题。通过策略路由和智能选路技术,确保HTTP/FTP服务在多运营商链路中的高可用性,避免路径不对称和NAT映射冲突等常见陷阱。

weixin_30897233的博客 548

H5 获取手机GPS坐标

只要手机有GPS模块,可以用HTML5的Geolocation接口获取 在HTML5中,geolocation作为navigator的一个属性出现,它本身是一个对象,拥有三个方法: getCurrentPosition watchPosition clearWatch 1.简单 function getLocation(){ if(navigator.geolocation){ //判断是否有这个对象 navigator.geoloc

达拉崩巴斑得贝迪卜多比鲁翁_ 4668

【Java网络编程】使用Tcp和Udp实现一个小型的回声客户端服务器程序

利用Java实现网络编程,编写一个小型的Udp和Tcp的回声客户端服务器程序。附带代码和详细的代码解释

yican2580的博客 2287

SBM与超效率SBM模型实战:从原始面板数据到MATLAB高效实现

本文详细介绍了SBM模型与超效率SBM模型的核心原理,并提供了从原始面板数据预处理到MATLAB高效实现的完整实战指南。通过具体代码解析,帮助研究者掌握如何利用MATLAB进行数据标准化、模型构建、效率求解及结果可视化,从而精准评估决策单元的相对效率,尤其适用于在高效单元中进一步精细排名的场景。

weixin_29100399的博客 478

Java 网络编程超详细总结(搬运)

1. 概述 计算机网络是通过传输介质、通信设施和网络通信协议,把分散在不同地点的计算机设备互连起来的,实现资源共享和数据传输的系统。网络编程就是编写程序使互联网的两个(或多个)设备(如计算机)之间进行数据传输。Java语言对网络编程提供了良好的支持。通过其提供的接口我们可以很方便地进行网络编程。 2. 网络分层 计算机网络20世纪60年代出现,经历了20世纪70年代、80年代和90年代的发展,进入21世纪后,计算机网络已经成为信息社会的基础设施,深入到人类社会的方方面面,与人们的工作、学习和生活息息相关。计

程序员小章的博客 1万+

从“点云”到“图像”:华为896线激光雷达的技术飞跃与行业影响浅析

华为发布全球首款896线双光路激光雷达,实现车载感知从"3D点云"到"3D成像"的跨越。该产品采用创新双光路架构,集成广角和长焦单元,单帧点云量达128线产品的7倍,可在55米外识别小狗摇尾巴等细节。实测数据显示,其能识别120米外14厘米低矮障碍物,夜间低反射率目标识别距离提升190%。尽管速腾聚创随后发布更高线数产品,但华为强调实用性和量产可行性,成本仅增加1-2万元。这一突破标志着激光雷达进入大规模应用阶段,将加速高阶智驾功能普及,强化华为在智能汽车领域的技术底

致力于lidar应用开发 211

BUG调试案例六:RK3568+国产YT8531网络PING调试案例

这次调试过程让我对后续类似问题的应对更加有信心。如果芯片在其他项目中已被验证可用,那么在我们的设计中原则上也应该能够正常工作。如果出现异常,就必须坚持追根溯源,找出具体原因和根本问题。每一次问题的解决,都是一次深入理解系统和提升能力的机会 —— 在不断探索和学习中,也在持续成长。

案例文章,高速信号 2332

【网络编程】——基于TCP协议实现回显服务器及客户端

【网络编程】——基于TCP协议实现回显服务器及客户端

m0_74352571的博客 4398

UE5接入在线直播视频源,如hls(m3u8)格式

UE5接入在线直播视频源

专注GIS开发 9499

Java网络编程 单向通信

Java的网络编程是Java编程语言中用于实现网络通信的一组API和工具。通过Java的网络编程,开发人员可以在Java应用程序中实现客户端和服务器之间的通信,从而构建各种网络应用。以上是对Java网络编程的简要介绍,希望对你有所帮助。如果你想深入了解Java网络编程的更多细节和示例代码,建议查阅相关的Java教程和文档。

Code-5的博客 2333

廖雪峰Python教程[完整版]

廖雪峰的python教程整理的,已经排好版了,而且还是完整的,适合小白

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

【Java】--网络编程:基于TCP协议的网络通信

这篇文章讲解了什么是网络编程,以及在java中如何实现基于TCP协议的网络编程。

qq_54185425的博客 1540

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

Java网络编程 双向通信

Java的网络编程是Java编程语言中用于实现网络通信的一组API和工具。通过Java的网络编程,开发人员可以在Java应用程序中实现客户端和服务器之间的通信,从而构建各种网络应用。以上是对Java网络编程的简要介绍,希望对你有所帮助。如果你想深入了解Java网络编程的更多细节和示例代码,建议查阅相关的Java教程和文档。

Code-5的博客 2504

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

Java网络编程学习笔记(三要素,UDP,TCP)

简述网络编程三要素以及它们的含义?①IP地址要想让网络中的计算机能够互相通信,必须为每台计算机指定一个标识号,通过这个标识号来指定要接收数据的计算机和识别发送的计算机,而IP地址就是这个标识号。也就是设备的标识② 端口网络的通信,本质上是两个应用程序的通信。每台计算机都有很多的应用程序,那么在网络通信时,如何区分这些应用程序呢?如果说IP地址可以唯一标识网络中的设备,那么端口号就可以唯一标识设备中的应用程序了。也就是应用程序的标识③协议。

2402_87028704的博客 880

Java 网络编程详解:实现网络通信的核心技术

本文将详细介绍Java网络编程的基础知识和核心技术。首先,我们将深入探讨网络编程的概念及其在现代应用中的重要性。然后,我们将学习TCP/IP协议,探究它在网络通信中的作用。接下来,我们将详细探讨Socket编程模型,了解如何使用Socket在客户端与服务器之间建立通信连接。最后,我们将通过几个代码示例演示如何实现简单的网络通信。

唯有努力,方可自信! 6582
上一篇: Java网络编程笔记——Socket用法详解
下一篇: XMLHttpRequest对象的使用
justdojava
博客等级 码龄17年 1粉丝 10原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值