在使用Apache MINA开发网络应用时需要使用一个过滤器来实现数据的编解码,因为在网络传输的数据都是二进制数据(byte),而你在程序中面向的是JAVA 对象,这就需要你实现在发送数据时将JAVA 对象编码二进制数据,而接收数据时将二进制数据解码为JAVA 对象。
Mina 中的协议编解码器通过过滤器ProtocolCodecFilter 构造,这个过滤器的构造方法需要一个ProtocolCodecFactory。
ProtocolCodecFactory 中有如下两个方法:
public interfaceProtocolCodecFactory {
ProtocolEncodergetEncoder(IoSession session) throws Exception;
ProtocolDecodergetDecoder(IoSession session) throws Exception;
}
因此,构建一个ProtocolCodecFactory 需要ProtocolEncoder、ProtocolDecoder 两个实例。
Mina 自带了几个编解码器工厂:TextLineCodecFactory 编解码器工厂来对字符串进行编解码处理。ObjectSerializationCodecFactory,一个Java对象的序列化和反序列化方法。PrefixedStringCodecFactory对使用固定长度作为前缀的字符串进行编解码处理。DemuxingProtocolCodecFactory,一个复合的编解码工厂可以包含多个消息编解码处理器。
在实际使用过程中由于业务规则不同可能会自定义编解码。也就是根据Server 端和Client 端约定网络传输的数据格式定义二进制数据与JAVA对象之间是如何转换的。实现的过程是先定义好协议对象,然后实现编码器(需继承适配器ProtocolEncoderAdapter),实行解码器(需继承CumulativeProtocolDecoder),最后是定义编解码工厂用来封装编码器和解码器。对于如何实现,在官网上提供了一个具体的实现例子http://mina.apache.org/tutorial-on-protocolcodecfilter-for-mina-2x.html。也有朋友将其翻译成中文http://blog.sina.com.cn/s/blog_608f624f0100l1e1.html。
下面总结我在使用时出现的几个问题:
1)对变长的数据处理,一般是在包头定义好包体的长度,根据定义好的长度来取数据。可按下述方法取:
in.mark();
if (bodyLen> in.remaining()) {
in.reset();
return false;
}else {
String szUserId = in.getString(64,charset.newDecoder());
message.setSzUserId(szUserId);
}
2)无符号的长整型字段,4个字节
longulSequence = in.getUnsignedInt();
3)JAVA对象转为二进制时,不足位补0。每个字段都要设置长度不然下一字段会跟在后面。
buffer.putString(message.getSzUserId(), 64,charset.newEncoder());
buffer.putString(message.getSzUserName(), 20,charset.newEncoder());
这样userid如果不足64位的会用\0补齐。
分享到:
相关推荐
3. **Protocol Codec**:Apache Mina提供了多种编码器和解码器,如ByteToMessageDecoder和MessageToByteEncoder,用于处理不同协议的数据格式转换。 4. **NIO(Non-blocking I/O)**:Mina利用Java的NIO库,实现高效...
4. **协议编码和解码**:Mina提供了多种编码器和解码器,用于将用户数据转换为网络传输格式,如ByteToMessageDecoder和MessageToByteEncoder。你可以根据需要自定义这些编码器和解码器以适应特定的协议。 5. **事件...
在这个"Apache MINA2学习笔记DEMO"中,我们很可能会看到如何使用MINA来创建一个自定义协议的示例。自定义协议通常是为了满足特定应用的需求,例如高效的数据传输、安全性或者特定的编码格式。MINA允许开发者定义自己...
Apache MINA 2.0 是一款高性能且易于使用的网络应用程序框架,它简化了开发人员在网络编程方面的负担,允许开发者专注于应用程序的核心功能,而不是底层的网络细节。MINA 2.0 支持多种网络协议,包括 TCP 和 UDP,...
4. **协议编码解码器**:用于将网络传输的数据转换为业务对象,反之亦然,可能实现了Mina的ProtocolCodec接口。 5. **测试用例**:验证服务端功能的JUnit或其他测试框架的测试类。 通过这个项目,开发者可以学习到...
3. **消息编码解码**:MINA 提供了 `ProtocolDecoder` 和 `ProtocolEncoder` 接口,用于将应用层的消息转换成字节流,以及将接收到的字节流转换回消息对象。 4. **服务端交互**:测试程序会发送请求到服务器并接收...
在这里,我们添加了两个过滤器:`LoggingFilter`用于记录网络通信的日志,以及`ProtocolCodecFilter`,它使用`TextLineCodecFactory`来编码和解码文本消息。`TextLineCodecFactory`依赖于指定的字符集(这里是UTF-8...
1. **I/O 事件处理**:MINA 使用事件驱动模型,当网络事件发生时(如连接建立、数据读取或写入完成),会触发相应的处理器。这使得程序可以高效地处理并发连接,无需为每个连接创建单独的线程。 2. **IoAcceptor**...
在本文中,我们将深入探讨Apache Mina的核心概念、设计模式以及如何使用它来实现基于Socket的通信。 **Apache Mina的核心概念:** 1. **Event-Driven模型**:Mina采用了事件驱动模型,当网络事件(如数据接收、...
使用Apache Mina时,开发者通常需要了解以下关键概念: - **Session**:代表一个网络连接,存储了与该连接相关的状态和属性。 - **Filter**:过滤器是处理数据或控制流的组件,可以通过添加、删除或调整过滤器顺序...
总之,自定义Mina编码器以实现会话累积功能涉及到了网络通信的优化,需要对Mina框架有深入的理解,以及对序列化和网络通信协议的熟悉。通过这样的定制,我们可以更高效地利用网络资源,提升系统的整体性能。
- **Protocol Codec**:MINA提供了多种编码和解码器,用于将复杂的数据结构转换为字节流,反之亦然,方便在网络间传输。 总的来说,Apache MINA提供了一套强大的工具,使开发者能够快速、高效地构建跨平台的网络...
Apache Mina 框架是一个强大的网络通信应用框架,它主要针对基于TCP/IP和UDP/IP的协议栈,同时也支持Java对象序列化和其他通信方式。Mina 的核心设计目标是帮助开发者快速构建高性能、高可扩展性的网络应用。它采用...
在实现多人聊天室时,首先需要创建一个Server端,该端使用Mina提供的Acceptor监听指定端口,等待客户端的连接请求。当有新的客户端连接时,Mina会自动创建一个新的Session对象来管理这个连接。接着,我们需要定义...
Apache Mina的核心思想是“事件驱动”和“异步I/O”,这使得它在处理大量并发连接时表现出色。它提供了一个统一的API,无论底层是TCP/IP、UDP还是其他协议,开发者都能用相同的接口进行操作,极大地降低了开发复杂性...
总的来说,Apache Mina是一个强大的工具,适合构建复杂的网络服务,特别是当需要高效处理大量并发连接和传输各种类型的数据时。通过深入理解并熟练运用Mina的高级特性,我们可以构建出高效、可靠的网络应用。
在本手册中,我们将深入探讨Apache Mina Server 2.0的各个方面,帮助初学者快速掌握其核心概念和使用方法。 首先,让我们了解Mina的基本架构。Mina采用事件驱动和非阻塞I/O模型,这种设计使得它能够在处理大量并发...
Apache Mina的IoFilter主要有以下作用:记录事件日志、测量系统性能、验证信息、过载控制以及信息的转换(例如编码和解码)。 要深入理解IoFilter,我们需从以下几个方面入手: 1. IoFilter的工作机制与应用场景 ...
Apache Mina是一个开源框架,主要用于构建高性能、高可用性的网络通信应用。在Mina 1.1.7版本中,提供的示例源码是学习和理解Mina框架工作原理及其实现各种网络协议的重要资源。这个压缩包"apache.mina.example"包含...