`
scholers
  • 浏览: 620280 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

MINA2中的拆包组包的处理及一些方法

阅读更多
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 断包,粘包问题解决

    mina_optimize压缩包中的代码示例,可能包含了客户端和服务端的实现,它们演示了如何配置和使用Mina来避免断包和粘包问题。服务端可能实现了监听特定端口,接收客户端连接,并使用自定义解码器处理接收到的数据。...

    java mina组合包

    这个“java mina组合包”看起来包含了Mina库的所有必要组件和可能的扩展,为开发者提供了完整的开发环境。 Mina的核心概念是基于NIO(非阻塞I/O)模型,它允许在单个线程上处理多个连接,从而极大地提高了系统资源...

    Mina断包,粘包处理(完整实例,有客户端,服务端)

    总的来说,理解和处理Mina中的断包和粘包问题,需要深入理解网络通信协议、数据编码解码原理以及Mina框架的工作机制。通过分析Android-Mina-master项目中的代码,我们可以学习到如何在实际应用中解决这些问题,提高...

    mina心跳包机制

    mina心跳包机制是Apache Mina框架中的一个关键特性,它用于维持网络连接的活跃状态,确保数据能够在客户端和服务端之间顺畅地传输。Mina是一个高度可扩展的Java网络应用框架,广泛应用于各种分布式系统和网络服务,...

    Mina 实例 包含jar包

    在这个"Mina实例 包含jar包"的压缩包中,我们预计会找到运行Mina示例所需的所有依赖库。 Mina的核心设计思想是提供一个可扩展的框架,允许开发者创建各种类型的网络服务,如TCP/IP协议的应用(如HTTP、FTP)、UDP...

    mina demo mina jar包

    在"压缩包子文件的文件名称列表"中提到了"mina demo",这可能是一个包含了所有必需文件的目录或压缩文件,包括Mina库的jar包、服务端和客户端的源代码、配置文件等。开发者可以通过这个示例学习如何配置Mina,如何...

    MINA2项目所用JAR包

    2. **mina-example-2.0.7.jar**:这个文件包含了一些MINA2的示例代码,可以帮助开发者理解如何使用MINA框架来实现特定的网络应用,如聊天服务器、文件传输等。 3. **mina-statemachine-2.0.7.jar**:状态机模块,...

    mina2依赖jar包

    标题"mina2依赖jar包"指的是Apache Mina 2项目所需的Java类库文件。这些jar包是Mina框架的核心组件,它们为开发网络应用程序提供了基础架构,特别是对于TCP/IP和UDP协议的高效处理。描述中列出的jar包包括: 1. **...

    Mina-2.0.7主要jar包

    2. **mina-integration-beans.jar**:这个jar包提供了与JavaBeans集成的能力,使得可以使用JavaBean属性和方法来配置Mina的组件,简化了Mina的使用。 3. **mina-integration-spring.jar**:对于使用Spring框架的...

    mina的高级使用,mina文件图片传送,mina发送文件,mina报文处理,mina发送xml和json

    在本文中,我们将深入探讨Mina的高级使用,特别是在文件图片传送、文件发送、XML和JSON报文处理方面的实践。 1. **Mina的高级使用** Mina的核心在于其异步事件驱动的模型,这使得它在处理大量并发连接时表现出色。...

    Mina2中文文档

    根据提供的信息,我们可以详细解析与"Mina2中文文档"相关的各个关键知识点: ### Mina2中文文档概述 #### Introduction Mina2是一个基于NIO(Non-blocking I/O)的高效网络通信框架,由Apache软件基金会维护。该...

    mina之间通讯所需要的jar包

    2. **Filter Chain**:MINA的过滤器链机制,允许你在数据传输过程中添加自定义的处理步骤,如加密、压缩、日志记录等。 3. **Event-driven Model**:MINA基于事件驱动模型,当网络事件发生(如连接建立、数据接收、...

    mina框架源码及jar包

    它维护了连接状态,并提供了一组事件驱动的方法,如`sessionCreated`、`messageReceived`等,用于处理网络交互。 4. **Protocol Buffers(协议缓冲区)**:Mina支持多种网络协议,如TCP、UDP、SSL/TLS等。开发者...

    mina简单通信需要的包

    标题中的“mina简单通信需要的包”指的是Apache Mina框架,这是一个用于构建高性能、异步网络应用程序的Java框架。在本文中,我们将深入探讨Mina的核心概念和它在通信中的应用,以及与之相关的库SLF4J。 Apache ...

    Apache MINA框架所用的jar包

    - **Session**:MINA中的Session代表了一个网络连接,它提供了读写数据、管理连接状态以及触发事件的方法。 - **IoHandler**:这是MINA中的核心接口,用于处理网络事件。当接收到数据或发生连接状态变化时,...

    mina依赖jar包

    使用这些jar包时,你需要将它们添加到你的项目的类路径中,以确保MINA框架能够正常工作。在开发过程中,你还需要了解如何配置MINA的服务器和客户端,如何定义过滤器链,以及如何处理网络事件。同时,熟悉Java NIO和...

    mina2技术知识

    MINA2的强大之处在于它为开发者提供了异步事件驱动的网络通信框架,免去了处理底层网络编程的复杂性,如多线程管理和数据缓冲等。 MINA2的核心概念包括: 1. **IoSession**:IoSession 是 MINA 中的核心接口,它...

    mina用法及用到的包

    博客文章“mina用法及用到的包”可能详细讲述了这些概念,并通过实例展示了如何配置和使用MINA,以及如何根据项目需求选择和利用相关的MINA包。可能还会讨论一些最佳实践,如何优化MINA应用,以及如何解决开发中遇到...

    mina.zip内涵所有mina所需jar包

    描述中重复提到"mina.jar 包,内涵mina所需的所有jar包,解压即可,测试可用",意味着这个"mina.jar"可能是一个集成了所有依赖的单一文件,或者是一个包含所有依赖的目录结构。这种打包方式便于用户快速部署和测试,...

    mina2 实例程序(socket通讯调用远程方法)

    在Mina2中,可以利用上述的编码器将方法名、参数等信息序列化为字节流,发送到服务器。服务器接收到数据后,反序列化并执行相应的方法,最后将结果返回。 5. **实例程序** 提供的"mina2-remotMethod"示例程序,...

Global site tag (gtag.js) - Google Analytics