1.position
例:
position()
第一次使用返回值为当前位置:0
position(8) 返回第8个字节以后的数据(包括第8个)可以和 limit 联合使用
如:
buffer.position(3);
buffer.limit(7);
ByteBuffer slice = buffer.slice();
再次调用 position() 返回:8
2.remaining
例:
ByteBuffer byt = ByteBuffer.allocate(128,false);
第一次调用
byt.remaining(); 返回 128
A、使用:byt.putInt(5);或者byt.getInt()或者byt.get(字节数组)等方法
之后调用 byt.remaining(); 返回 124
B、但使用 byt.putInt(5,4);或者byt.getInt(0) 之后,调用方法
byt.remaining();返回 128
3.prefixedDataAvailable
prefixedDataAvailable(4) int
该方法很好用。判断前四字节的整型值是否大于等于整个缓冲区的数据。可以方便的判断一次
messageReceived 过来的数据是否完整。(前提是自己设计的网络通讯协议前四字节等于发送数据的长度)
prefixedDataAvailable(2) Short int
网上找到的例子:
protected boolean doDecode(IoSession session, IoBuffer in,
ProtocolDecoderOutput out) throws Exception {
if (in.prefixedDataAvailable(4, Constants.MAX_COMMAND_LENGTH)) {
int length = in.getInt();
byte[] bytes = new byte[length];
in.get(bytes);
int commandNameLength = Constants.COMMAND_NAME_LENGTH;
byte[] cmdNameBytes = new byte[commandNameLength];
System.arraycopy(bytes, 0, cmdNameBytes, 0, commandNameLength);
String cmdName = (new String(cmdNameBytes)).trim();
AbstractTetrisCommand command = TetrisCommandFactory
.newCommand(cmdName);
if (command != null) {
byte[] cmdBodyBytes = new byte[length - commandNameLength];
System.arraycopy(bytes, commandNameLength, cmdBodyBytes, 0,
length - commandNameLength);
command.bodyFromBytes(cmdBodyBytes);
out.write(command);
}
return true;
} else {
return false;
}
}
MINA中分段读取数据的方法:
2. ProtobufRPCRequestProtocolDecoder.java
package com.lizongbo.protobufrpc;
import org.apache.mina.filter.codec.ProtocolDecoder;
import org.apache.mina.core.session.IoSession;
import org.apache.mina.core.buffer.IoBuffer;
import org.apache.mina.filter.codec.ProtocolDecoderOutput;
import org.apache.mina.core.session.AttributeKey;
public class ProtobufRPCRequestProtocolDecoder implements ProtocolDecoder {
private static final AttributeKey BUF_BYTE = new AttributeKey(
ProtobufRPCRequestProtocolDecoder.class, "bufb");
public void decode(IoSession ioSession, IoBuffer ioBuffer,
ProtocolDecoderOutput protocolDecoderOutput) throws
Exception {
try {
IoBuffer bufTmp = null;
byte[] buf = (byte[]) ioSession.getAttribute(BUF_BYTE);
if (buf == null) {
System.out.println("没有尚未处理的数据" + ioBuffer.remaining());
bufTmp = ioBuffer;
} else {
System.out.println("合并尚未处理的数据" + ioBuffer.remaining());
bufTmp = IoBuffer.allocate(buf.length + ioBuffer.remaining());
bufTmp.setAutoExpand(true);
bufTmp.put(buf);
bufTmp.put(ioBuffer);
bufTmp.flip();
} while (bufTmp.remaining() >= 4
&& bufTmp.remaining() >= bufTmp.getInt(bufTmp.position())) { // 循环处理数据包
System.out.println("循环处理数据包");
int dataLen = bufTmp.getInt(bufTmp.position());
byte[] b = new byte[dataLen];
bufTmp.get(b);
ProtobufRPCRequest pak = new ProtobufRPCRequest();
pak.setReqByteLen(b.length);
pak.readFrom(b, 4);
System.out.println("往下传递");
protocolDecoderOutput.write(pak);
}
if (bufTmp.hasRemaining()) { // 如果有剩余的数据,则放入Session中
System.out.println("如果有剩余的数据,则放入Session中" + bufTmp.remaining());
byte[] tmpb = new byte[bufTmp.remaining()];
bufTmp.get(tmpb);
ioSession.setAttribute(BUF_BYTE, tmpb);
}
} catch (Exception ex) {
ex.printStackTrace();
}
}
public void dispose(IoSession session) throws Exception {
System.out.println("dispose");
}
public void finishDecode(IoSession session, ProtocolDecoderOutput out) throws
Exception {
System.out.println("finishDecode");
}
}
分享到:
相关推荐
mina_optimize压缩包中的代码示例,可能包含了客户端和服务端的实现,它们演示了如何配置和使用Mina来避免断包和粘包问题。服务端可能实现了监听特定端口,接收客户端连接,并使用自定义解码器处理接收到的数据。...
这个“java mina组合包”看起来包含了Mina库的所有必要组件和可能的扩展,为开发者提供了完整的开发环境。 Mina的核心概念是基于NIO(非阻塞I/O)模型,它允许在单个线程上处理多个连接,从而极大地提高了系统资源...
总的来说,理解和处理Mina中的断包和粘包问题,需要深入理解网络通信协议、数据编码解码原理以及Mina框架的工作机制。通过分析Android-Mina-master项目中的代码,我们可以学习到如何在实际应用中解决这些问题,提高...
mina心跳包机制是Apache Mina框架中的一个关键特性,它用于维持网络连接的活跃状态,确保数据能够在客户端和服务端之间顺畅地传输。Mina是一个高度可扩展的Java网络应用框架,广泛应用于各种分布式系统和网络服务,...
在这个"Mina实例 包含jar包"的压缩包中,我们预计会找到运行Mina示例所需的所有依赖库。 Mina的核心设计思想是提供一个可扩展的框架,允许开发者创建各种类型的网络服务,如TCP/IP协议的应用(如HTTP、FTP)、UDP...
在"压缩包子文件的文件名称列表"中提到了"mina demo",这可能是一个包含了所有必需文件的目录或压缩文件,包括Mina库的jar包、服务端和客户端的源代码、配置文件等。开发者可以通过这个示例学习如何配置Mina,如何...
2. **mina-example-2.0.7.jar**:这个文件包含了一些MINA2的示例代码,可以帮助开发者理解如何使用MINA框架来实现特定的网络应用,如聊天服务器、文件传输等。 3. **mina-statemachine-2.0.7.jar**:状态机模块,...
标题"mina2依赖jar包"指的是Apache Mina 2项目所需的Java类库文件。这些jar包是Mina框架的核心组件,它们为开发网络应用程序提供了基础架构,特别是对于TCP/IP和UDP协议的高效处理。描述中列出的jar包包括: 1. **...
2. **mina-integration-beans.jar**:这个jar包提供了与JavaBeans集成的能力,使得可以使用JavaBean属性和方法来配置Mina的组件,简化了Mina的使用。 3. **mina-integration-spring.jar**:对于使用Spring框架的...
在本文中,我们将深入探讨Mina的高级使用,特别是在文件图片传送、文件发送、XML和JSON报文处理方面的实践。 1. **Mina的高级使用** Mina的核心在于其异步事件驱动的模型,这使得它在处理大量并发连接时表现出色。...
根据提供的信息,我们可以详细解析与"Mina2中文文档"相关的各个关键知识点: ### Mina2中文文档概述 #### Introduction Mina2是一个基于NIO(Non-blocking I/O)的高效网络通信框架,由Apache软件基金会维护。该...
2. **Filter Chain**:MINA的过滤器链机制,允许你在数据传输过程中添加自定义的处理步骤,如加密、压缩、日志记录等。 3. **Event-driven Model**:MINA基于事件驱动模型,当网络事件发生(如连接建立、数据接收、...
它维护了连接状态,并提供了一组事件驱动的方法,如`sessionCreated`、`messageReceived`等,用于处理网络交互。 4. **Protocol Buffers(协议缓冲区)**:Mina支持多种网络协议,如TCP、UDP、SSL/TLS等。开发者...
标题中的“mina简单通信需要的包”指的是Apache Mina框架,这是一个用于构建高性能、异步网络应用程序的Java框架。在本文中,我们将深入探讨Mina的核心概念和它在通信中的应用,以及与之相关的库SLF4J。 Apache ...
- **Session**:MINA中的Session代表了一个网络连接,它提供了读写数据、管理连接状态以及触发事件的方法。 - **IoHandler**:这是MINA中的核心接口,用于处理网络事件。当接收到数据或发生连接状态变化时,...
使用这些jar包时,你需要将它们添加到你的项目的类路径中,以确保MINA框架能够正常工作。在开发过程中,你还需要了解如何配置MINA的服务器和客户端,如何定义过滤器链,以及如何处理网络事件。同时,熟悉Java NIO和...
MINA2的强大之处在于它为开发者提供了异步事件驱动的网络通信框架,免去了处理底层网络编程的复杂性,如多线程管理和数据缓冲等。 MINA2的核心概念包括: 1. **IoSession**:IoSession 是 MINA 中的核心接口,它...
博客文章“mina用法及用到的包”可能详细讲述了这些概念,并通过实例展示了如何配置和使用MINA,以及如何根据项目需求选择和利用相关的MINA包。可能还会讨论一些最佳实践,如何优化MINA应用,以及如何解决开发中遇到...
描述中重复提到"mina.jar 包,内涵mina所需的所有jar包,解压即可,测试可用",意味着这个"mina.jar"可能是一个集成了所有依赖的单一文件,或者是一个包含所有依赖的目录结构。这种打包方式便于用户快速部署和测试,...
在Mina2中,可以利用上述的编码器将方法名、参数等信息序列化为字节流,发送到服务器。服务器接收到数据后,反序列化并执行相应的方法,最后将结果返回。 5. **实例程序** 提供的"mina2-remotMethod"示例程序,...