前不久,一个客户使用MINA架构服务器,在与客户端通信时,出现了问题。表现的现象是第一次通讯可以,从第二次通讯开始就出错。那时候,我还没有接触过MINA,只好用二分法打印中间数据,最后花了两个多小时,找到了错误的原因,就是因为对ByteBuffer不熟悉,在使用ByteBuffer的limit方法时,产生了一个字节的错位。
ByteBuffer是MINA中最常用的类之一,搞清楚它的原理是非常有必要的。
ByteBuffer是一个线性的字节空间,相当于字节数组;在初始化时,要给它分配一个大小。但是实际分配的大小,是有规则的,一般为128的倍数。比如,传入的值为100,则分配128;传入200,则分配256;传入300,则分配512。
ByteBuffer有五个重要的属性;position、limit、mark、remaining和capacity;
新分配的空间;position为0;limit和remaining等于capacity;mark为-1;
使用ByteBuffer的clear方法后,ByteBuffer的状态和新分配的状态一样。
怎么向ByteBuffer中添加数据?
使用put方法,position将发生改变;如果put的数据超过了limit和capacity的限制,将会抛出异常:BufferOverflowException;
在使用put方法后,remaining反映了ByteBuffer中有效数据情况。
如果将ByteBuffer的AutoExpand设置为true,当分配的capacity不够时,capacity将会自动扩张。扩张的策略与分配空间的策略相同。
怎么从ByteBuffer中读取数据?
使用get方法;需要注意的是,position记录的是当前的位置;对于get和put有着不同的含义;get需要的position是数据的开头;而put的position表示的数据的结尾。
所以,在写入数据和读取数据之间要用flip方法;
flip方法用limit记录数据的尾,并将position清0表示数据的头。
有的时候,需要读取当前位置的position之前的数据,这需要通过mark和reset实现。
如何移动ByteBuffer中某一块的数据?
先建一个ByteBuffer,把需要移动的数据块拷贝到ByteBuffer中;再将当前ByteBuffer清空;最后,将新的ByteBuffer的数据拷贝回来。
分享到:
相关推荐
本篇将深入探讨Java NIO(非阻塞I/O)中的ByteBuffer和Mina库自定义的ByteBuffer之间的区别。 Java NIO的ByteBuffer是Java标准库提供的一个核心类,它是通道(Channel)和缓冲区(Buffer)之间数据传输的主要媒介。它...
深入理解Apache_Mina_(1)----_Mina的几个类 深入理解Apache_Mina_(2)----_与IoFilter相关的几个...深入理解Apache_Mina_(6)----_Java_Nio_ByteBuffer与Mina_ByteBuffer的区别(类图) 相信你们也愿意去下载更有价值的东西
Mina也提供了自己的ByteBuffer实现,它扩展了Java Nio的ByteBuffer,增加了更多的便利功能,比如更方便的读写操作、更高效的内存管理以及与其他Mina组件的集成。Mina ByteBuffer的使用可以优化性能,减少内存复制,...
在本文中提到的Java Nio ByteBuffer与Mina ByteBuffer的差异,实际上揭示了Apache Mina对于底层网络通信的封装程度。Apache Mina之所以能够成为一个广泛使用的框架,很大程度上是因为它解决了开发者在处理大量网络...
深入理解MINA的ByteBuffer和Java Nio ByteBuffer的区别,可以帮助开发者优化性能并减少内存拷贝。 线程模型是MINA的另一个关键配置项。MINA提供了多种线程模型,如简单的单线程模型、多线程模型以及Event-driven...
对于希望提高网络应用性能或熟悉Java NIO编程的开发者来说,Apache Mina 2.0.4的源码分析是一次宝贵的学习机会。你可以通过阅读源码学习到如何有效地处理高并发场景,如何设计和实现高效的网络协议,以及如何利用...
**mina自定义编解码器详解** mina是一个Java开发的网络通信框架,广泛应用于TCP和UDP协议的服务器和客户端开发。在mina框架中,编解码器(Codec)扮演着至关重要的角色,它负责将应用层的数据转换为网络传输的字节...
Apache Mina是一个开源的网络通信应用框架,主要应用于Java平台,它为高性能、高可用性的网络应用程序提供了基础架构。在本文中,我们将深入探讨Mina的高级使用,特别是在文件图片传送、文件发送、XML和JSON报文处理...
Apache Mina是一个开源的网络通信框架,常用于构建高性能、高效率的服务端应用程序,尤其在Java平台上。在本文中,我们将深入探讨Mina的核心概念,包括连接管理、心跳机制以及断线重连策略。 首先,让我们理解"Mina...
MINA (Java IO Network Application Framework) 是一个由Apache软件基金会开发的开源网络通信框架,主要应用于构建高性能、高可用性的网络服务器。这个压缩包包含了MINA API文档、自学手册以及开发指南,对于学习和...
开发人员可以通过Mina提供的ByteBuffer控制数据的分配,选择从堆或栈中分配内存,甚至可以启用可选的缓冲池机制以优化性能。在即将发布的版本中,Mina将进一步简化ByteBuffer的使用,提供非池化和仅限堆内存的实现,...
Mina和Socket是两种常见的网络通信框架和技术,它们在Java编程环境中被广泛使用。本篇文章将深入探讨如何使用Mina与Socket实现通信,并提供客户端和服务端的实现代码概述。 Mina(全称“MINA: Minimalistic ...
4. 在MINA服务端和客户端中使用生成的Java类:将数据序列化为字节数组,通过MINA的ByteBuffer进行传输;在接收端反序列化恢复数据。 5. 集成MINA事件处理器:在MINA的IoHandler或Filter中处理接收到的数据,进行反...
4. **Buffer**:MINA 提供了 ByteBuffer 和 IoBuffer 两种缓冲区,用于在网络通信中高效地读写数据。 **MINA 2.0.1 版本特点:** 1. **性能优化**:在 2.0.1 版本中,MINA 进行了多方面的性能提升,包括更快的数据...
mina-core-2.0.0-M6.jar mina-example-2.0.0-M6.jar mina-filter-codec-netty-2.0.0-M6.jar mina-filter-compression-2.0.0-M6.jar mina-integration-beans-2.0.0-M6.jar mina-integration-jmx-2.0.0-M6.jar mina-...
这个字符串可以通过Mina的WriteRequest对象发送,WriteRequest通常包含一个ByteBuffer或一个可序列化的对象。Mina会自动处理字符串到字节的转换,然后通过网络发送给服务器。 服务端接收到连接请求后,会创建一个...
mina新手案例,mina新手教程源码 mina+springboot最简单的案例。用的IDEA * mina服务端 * 1、添加@Controller注解和 @PostConstruct注解,代表启动springboot项目时也调用该类下的该方法, * 启动springboot项目...
客户端会将图片数据转化为字节数组,然后通过MINA的`ByteBuffer`发送给服务器。 ```java public class MinaClient { private static final String SERVER_ADDRESS = "localhost"; private static final int PORT ...
标题中的“给予mina协议进行大数据传输”指的是一种基于Java的网络通信框架——Apache MINA(Model-View-Controller for Network Applications)。MINA是Apache软件基金会的一个项目,它提供了一个高度可扩展和高...