`
Chrisp
  • 浏览: 4413 次
  • 性别: Icon_minigender_1
  • 来自: 大连
社区版块
存档分类
最新评论

Apache MINA学习之路(2)

 
阅读更多

1.IoService 接口
    作用:IoService 是创建服务的顶层接口,无论客户端还是服务端,都是从它继承实现的。
    常用接口为:IoService,IoAcceptor ,IoConnector
    常用类为:NioSocketAcceptor ,NioSocketConnector

 

2.IoFilter 接口 -- 过滤器

   官方文档中的作用:
    (1)记录事件的日志(Mina默认提供了LoggingFilter)
    (2)测量系统性能
    (3)信息验证
    (4)过载控制
    (5)信息的转换(主要就是编码和解码)
    (6)和其他更多的信息

    常用接口为:IoFilter ,IoFilterChainBuilder
    常用类为:IoFilterAdapter,DefaultIoFilterChainBuilder,ProtocolCodecFilter,LoggingFilter

    注:Mina 中有一个重要的设计模式-责任链模式

    资料阅读:http://www.iteye.com/topic/1124504

 

  自定义编解码器

     编码和解码的前提就是协议的制定:比如使用 Mina 自带的根据文本换行符解码的 TextLineCodecFactory(), 如果遇到文本换行符就开始编解码!

     制定协议的方法:
                          ●定长消息法
                          ●字符定界法
                          ● 定长报文头

      根据协议, 把二进制数据转换成 Java 对象称为解码 (也叫做拆包);把 Java对象转换为二进制数据称为编码(也叫做打包)。

 

  模拟根据文本换行符编解码

    解码器

import java.nio.charset.Charset;

import org.apache.mina.core.buffer.IoBuffer;
import org.apache.mina.core.session.IoSession;
import org.apache.mina.filter.codec.ProtocolDecoder;
import org.apache.mina.filter.codec.ProtocolDecoderOutput;

public class MyCodecDecoder implements ProtocolDecoder {
	private Charset charset = Charset.forName("UTF-8");
	//allocate(int capacity,boolean useDirectBuffer)第一个参数指定初始化容量,第二个参数指定使用直接缓冲区还是 JAVA 内存堆的缓存区,默认为 false
	//setAutoExpand自动扩展容量
	IoBuffer buf = IoBuffer.allocate(100).setAutoExpand(true);

	public void decode(IoSession session, IoBuffer in, ProtocolDecoderOutput out)
			throws Exception {
		//判断当前是否有数据
		while (in.hasRemaining()) {
			byte b = in.get();
			buf.put(b);
			if (b == '\n') {
				//为了读取做好准备,一般是结束buf操作,将buf写入输出流时调用
				buf.flip();
				byte[] msg = new byte[buf.limit()];
				buf.get(msg);
				String message = new String(msg, charset);
				// 解码成功,把buf重置
				buf = IoBuffer.allocate(100).setAutoExpand(true);
				out.write(message);
			}
		}
	}

	public void dispose(IoSession session) throws Exception {
	}

	public void finishDecode(IoSession session, ProtocolDecoderOutput out)
			throws Exception {
	}
}

    

   编码器

import java.nio.charset.Charset;
import java.nio.charset.CharsetEncoder;

import org.apache.mina.core.buffer.IoBuffer;
import org.apache.mina.core.session.IoSession;
import org.apache.mina.filter.codec.ProtocolEncoder;
import org.apache.mina.filter.codec.ProtocolEncoderOutput;

public class MyCodecEncoder implements ProtocolEncoder {
	private Charset charset = Charset.forName("UTF-8");

	public void encode(IoSession session, Object message,
			ProtocolEncoderOutput out) throws Exception {
		IoBuffer buf = IoBuffer.allocate(100).setAutoExpand(true);
		CharsetEncoder ce = charset.newEncoder();
		buf.putString(message.toString(), ce);
		// buf.put(message.toString().getBytes(charset));
                //在结尾添加\r\n输出
		buf.put((byte) '\r');
		buf.put((byte) '\n');
		buf.flip();
		out.write(buf);
	}

	public void dispose(IoSession session) throws Exception {
	}
}

 

    编解码器工厂类

import org.apache.mina.core.session.IoSession;
import org.apache.mina.filter.codec.ProtocolCodecFactory;
import org.apache.mina.filter.codec.ProtocolDecoder;
import org.apache.mina.filter.codec.ProtocolEncoder;

public class MyCodecFactory implements ProtocolCodecFactory {
	public ProtocolDecoder getDecoder(IoSession session) throws Exception {
		return new MyCodecDecoder();
	}

	public ProtocolEncoder getEncoder(IoSession session) throws Exception {
		return new MyCodecEncoder();
	}
}

 

   测试

// 设置过滤器(使用Mina提供的文本换行符编解码器)
acceptor.getFilterChain().addLast(
"codec",
new ProtocolCodecFilter(new MyTextLineCodecFactory()));

     启动服务器,通过telnet进行测试

 

3.IoHandler 接口 --业务处理

    常用类为:IoHandlerAdapter

 

    IoHandler 是 Mina 实现其业务逻辑的接口;在 IoHandler 中定义了 7个方法,根据 I/O 事件来触发对应的方法:

import org.apache.mina.core.session.IdleStatus;
import org.apache.mina.core.session.IoSession;

public interface IoHandler {
	// 当一个新的连接建立时,由 I/O processor thread 调用
	void sessionCreated(IoSession session) throws Exception;  
	// 当连接打开是调用
	void sessionOpened(IoSession session) throws Exception;
	// 当连接关闭时调用
	void sessionClosed(IoSession session) throws Exception;
	// 当连接进入空闲状态时调用
	void sessionIdle(IoSession session, IdleStatus status) throws Exception;
	// 当实现 IoHandler 的类抛出异常时调用
	void exceptionCaught(IoSession session, Throwable cause) throws Exception;
	// 当接收了一个消息时调用
	void messageReceived(IoSession session, Object message) throws Exception;
	// 当一个消息被(IoSession.write)发送出去后调用
	void messageSent(IoSession session, Object message) throws Exception;
}
分享到:
评论
1 楼 白天看黑夜 2017-10-20  
Apache Mina Server 2.0 中文参考手册(带目录),有需要的自己下载吧
http://www.itmayun.com/it/files/226631678709806/resource/484719910403706/1.html

相关推荐

    Apache Mina Server 2.0中文参考手册V1.0,Apache Mina2.0学习笔记(修订版)

    Apache Mina Server 2.0中文参考手册V1.0,Apache Mina2.0学习笔记(修订版)Apache Mina Server 2.0中文参考手册V1.0,Apache Mina2.0学习笔记(修订版)

    apache Mina的完整学习资料

    在学习Apache Mina时,首先要理解其核心组件和设计模式。Mina的核心组件包括Session、Filter、ProtocolCodec等。Session代表了客户端和服务器之间的连接,Filter则提供了数据处理链,ProtocolCodec则用于将应用层的...

    Apache mina2学习笔记DEMO

    在这个"Apache MINA2学习笔记DEMO"中,我们很可能会看到如何使用MINA来创建一个自定义协议的示例。自定义协议通常是为了满足特定应用的需求,例如高效的数据传输、安全性或者特定的编码格式。MINA允许开发者定义自己...

    apache-mina-2.0.4.rar_apache mina_mina

    对于希望提高网络应用性能或熟悉Java NIO编程的开发者来说,Apache Mina 2.0.4的源码分析是一次宝贵的学习机会。你可以通过阅读源码学习到如何有效地处理高并发场景,如何设计和实现高效的网络协议,以及如何利用...

    apache mina 学习笔记三(子项目FtpServer)

    在本学习笔记中,我们将专注于MINA的子项目——FtpServer,它是实现FTP服务器功能的一个模块。 FTP(File Transfer Protocol)是一种广泛使用的互联网协议,用于在不同主机之间传输文件。Apache MINA FtpServer提供...

    Apache Mina帮助文档

    Apache Mina是一个高度可扩展的网络通信框架,主要用于构建高性能、高效率的服务端应用程序。...通过学习和使用"Mina帮助文档",开发者可以更好地理解和利用这个框架,构建出高效、稳定的网络应用。

    Apache Mina 入门Demo

    2. **IoSession接口**:Mina的核心概念之一是IoSession,它代表了客户端和服务器之间的连接。IoSession提供了读写数据、管理连接状态、注册事件监听器等功能。 3. **Filter链机制**:Mina采用了过滤器链设计模式,...

    apache mina实例免费下载

    Apache MINA(Multipurpose Infrastructure for Network Applications)是一个开源框架,主要设计用于简化网络应用程序的开发,尤其是基于TCP和UDP协议的应用。它提供了高度可扩展和高性能的非阻塞I/O模型,使得...

    apache-mina-2.0.4架包及源码各pdf学习教程

    apache-mina-2.0.4 架包 源码 学习教程.apache mina是Apache 组织一个较新的项目,它为开发高性能和高可用性的网络应用程序提供了非常便利的框架。当前发行的 MINA 版本支持基于 Java NIO 技术的 TCP/UDP 应用程序...

    Apache MINA框架相关资料

    标题中的“Apache MINA框架相关资料”涵盖了对MINA框架的全面学习材料,包括中文参考手册、源码分析、API文档和与Spring框架的整合指南。 1. **中文参考手册**(Apache_Mina_Server_2.0中文参考手册V1.0.pdf):这...

    Apache Mina 2 完全自学手册

    ### Apache Mina 2完全自学手册关键知识点解析 #### 引言 Apache Mina 2是Apache项目下的一款高性能、高可扩展性的网络应用框架,它简化了Java NIO编程,使得开发者能够更加轻松地构建复杂的网络应用。Mina通过...

    一个Apache MINA使用案例源代码ApacheMina

    Apache MINA是一个高性能、异步事件驱动的网络应用程序框架,主要设计用于简化开发服务器端的高性能网络应用。这个框架提供了一种抽象层,允许开发者使用相同的API处理多种不同的传输协议,如TCP/IP、UDP/IP以及SSL/...

    Apache MINA 2.0 用户指南( 缺第一章节)

    ### Apache MINA 2.0 用户指南:基础知识 #### 基础概念介绍 Apache MINA 2.0 是一款高性能且易于使用的网络...在未来的学习过程中,我们将更深入地探索 MINA 的高级特性,如会话管理、错误处理、安全性和扩展性等。

    apache mina-spring 服务端程序

    通过这个项目,开发者可以学习到如何将Mina的异步I/O能力与Spring的容器管理及依赖注入机制结合,构建出健壮且易于维护的网络服务端程序。这包括理解Mina的事件模型、Spring的bean管理和网络编程的最佳实践。同时,...

    Apache Mina Server 2.0 抢鲜体验

    Apache Mina Server 2.0 是一款高性能、...此外,下载的压缩包文件“minaTest”可能包含示例代码或测试项目,可以作为学习和实践Apache Mina的好材料。通过这些实践,你可以加深对Mina的理解,并将其应用到实际项目中。

    Apache-Mina-2.rar_apache mina_java mina_mina_mina-core-1.1.3

    标题中的"Apache-Mina-2.rar"和"mina-mina-core-1.1.3"表明这是关于Apache Mina 2.x版本,特别是其核心模块的1.1.3版本。 Apache Mina的名称来源于"Multi-purpose Infrastructure for Network Applications",它...

    apache-mina例子

    Apache Mina是一个开源项目,主要用于构建高...在`MinaTimeServer`和`MinaClient`的例子中,我们可以看到如何使用Mina轻松地建立一个简单的服务器和客户端通信系统,这对于理解和学习Mina的基本用法是非常有帮助的。

    apache mina 中文版 学习资料(很详细的哟)

    很详细的描述了apache mina 框架,对于那些对于英文不是很懂得人,这简直就是福音啊,哈哈

    apache-mina源码

    通过阅读和分析`apache-mina-2.0.16`的源码,我们可以深入理解MINA的设计思想,学习如何构建高效的网络服务,并能根据自己的需求定制和扩展MINA的功能。对于想要从事网络编程或系统架构设计的开发者来说,研究MINA...

Global site tag (gtag.js) - Google Analytics