MINA通信deCode实现

原创 2014年06月13日 09:21:17
public class SocketServerDecoder extends CumulativeProtocolDecoder {
private static final Logger log = Logger.getLogger(SocketServerDecoder.class);
public static final boolean ifPrintDebugInfo=false;
private Charset charset =null;
private static final String ATTRIBUTE_NAME="HelperMsgInfo";

public SocketServerDecoder(Charset charset) {
this.charset=charset;
log.debug("Server端#SocketServerDecoder构造方法,当前线程:"+Thread.currentThread().getId());
}

@Override
protected boolean doDecode(IoSession session, IoBuffer ioBuffer,
ProtocolDecoderOutput out) throws Exception {
ioBuffer.order(ByteOrder.LITTLE_ENDIAN);
log.debug("Server端#doDecode#剩余客户端消息大小:"+ioBuffer.remaining());
sysPrintLn("Server端#doDecode#ioBuffer读到剩余客户端消息大小:"+ioBuffer.remaining());
MessageInfo hmi=null;
String attrStr=ATTRIBUTE_NAME+session.getId();
Object o=session.getAttribute(attrStr);
if(null!=o && (o instanceof MessageInfo)){
hmi=(MessageInfo)o;
}
//修改缓冲区的字节顺序为little-endian,按照此顺序,多字节值的字节顺序是从最低有效位到最高有效位的。
    if(null==hmi){
    sysPrintLn("null==hmi");
    if(ioBuffer.remaining()>4){
    sysPrintLn("ioBuffer.remaining()>4");
    hmi=new MessageInfo();
    short  bodyLength= ioBuffer.getShort();
    short  msgIdentify=ioBuffer.getShort();
    hmi.setMsgBodySize(bodyLength);
    hmi.setMsgIdentify(msgIdentify);
    sysPrintLn("ioBuffer.position [null==hmi]:"+ioBuffer.position());
    sysPrintLn("bodyLength:"+bodyLength);
    sysPrintLn("msgIdentify:"+msgIdentify);
    session.setAttribute(attrStr,hmi);
    sysPrintLn(" [null==hmi]将再次调用当前解码方法!");
    return true;
    }else{
    sysPrintLn("ioBuffer.remaining()<=4");
    sysPrintLn("将继续接收!");
    return false;
    }
    }else{
    sysPrintLn(" [null!=hmi]");
    sysPrintLn("剩余byte大小1:"+ioBuffer.remaining());
if (ioBuffer.remaining() >= hmi.getMsgBodySize()) {
sysPrintLn("ioBuffer.remaining() >= hmi.getMsgbodySize()!");
/*
* 检查缓冲区的可用字节数是否大于等于消息体长度,即是否读取到消息体了。
*/
byte[] messageBody = new byte[hmi.getMsgBodySize()]; // 创建定长的数组存放消息体
ioBuffer.get(messageBody); // 从缓冲区中读取bodyLength字节的数据填充进数组
String msgbody = new String(messageBody,charset); // 设置请求的消息体
sysPrintLn("msgbody:"+msgbody);
hmi.setMsgBody(msgbody);
/*
* 将session对象的“HelperMsgInfo”键及其对应的属性值移除从而:
* 1、将bodySize键设置成无值状态,代表消息体已经解析完成。再次进入等待解析消息头阶段
* 2、释放存储“HelperMsgInfo”键的属性值占用的内存。
*/
session.removeAttribute(attrStr);
/*
* 将解码后生成的请求对象对象抛给位于应用层的Handler处理,或者抛给下一层解码器(如果存在)。
*/
out.write(hmi);
/*
* 因为当一条完整消息解析完成后,这时缓冲区内可能还有足够的积累数据可以继续解析下一条消息(也可能没有),
* 返回true使框架再次调用doDecode方法 。 
* 即使缓冲区内没有足够的数据了,也应该留给下次调用doDecode方法时去判断。
*/
sysPrintLn("[null!=hmi]将再次调用当前解码方法!");
return true;
} else {
sysPrintLn("ioBuffer.position *****:"+ioBuffer.position());
sysPrintLn("剩余byte大小 ****:"+ioBuffer.remaining());
sysPrintLn("ioBuffer.remaining() < hmi.getMsgbodySize()!");
/*
* 如果缓冲区内可用字节个数不足以构成完整的消息体,
* 直接返回false告诉框架不要再回调doDecode方法,
* 直到网络获取到数据压进缓冲区时再调用
*/
sysPrintLn("将继续接收!");
return false;
}
    }
}

private void sysPrintLn(String s){
if(SocketServerDecoder.ifPrintDebugInfo){
System.out.println(s);
}
}
}

mina IoBuffer 处理断包、粘包

今天下午重温了一下项目中消息处理部分,其中关于IoBuffer重新学习了一下。   版本mina1.7.;   IoBuffer中有三个重要的方法,limit capacity position....
  • cao478208248
  • cao478208248
  • 2014年11月23日 11:10
  • 1203

Mina IoBuffer的特性介绍

原文地址:Mina IoBuffer(Apache Mina user guide Chapter8 IoBuffer) 一个字节缓冲区被Mina的应用程序所使用。这是一个ByteBuffer的替代...
  • boonya
  • boonya
  • 2016年06月07日 11:54
  • 2824

IoBuffer中mark()方法的使用

mark就像书签一样,在这个IoBuffer里作个标记,以后再调用reset时就可以再回到这个mark过的地方。 也就是mark与reset是配对使用的!     mark方法有个参数,通过这个整型...
  • amandalm
  • amandalm
  • 2014年09月20日 20:44
  • 787

Mina二进制传输对象IoBuffer的使用

Mina二进制传输对象IoBuffer的使用
  • pdw2009
  • pdw2009
  • 2016年03月12日 02:35
  • 2581

Mina源码阅读笔记(二)- IoBuffer的封装

在阅读IoBuffer源码之前,我们先看Mina对IoBuffer的描述:A byte buffer used by MINA applications. This is a replacemen...
  • canlets
  • canlets
  • 2013年11月07日 10:20
  • 2682

Java字节数组处理工具类-Mina的IoBuffer封装

Java字节数组处理工具类-Mina的IoBuffer封装处理网络数据的项目中经常需要处理字节数据,Java的ByteBuffer很强大,但是Mina和Netty两个常用的网络通信框架都拥有自己的数据...
  • handsome_926
  • handsome_926
  • 2016年05月30日 23:59
  • 2597

使用Mina框架实现C/S通讯

什么是Mina? Apache MINA is a network application framework which helps users develop... Apache MINA是一...
  • linchaolong
  • linchaolong
  • 2015年06月11日 23:26
  • 4047

使用mina当服务器进行纯文本消息或多媒体消息加密会话

首先,对于mina的基本使用这里就不多说了,之前已经转载了一篇很详细的说明。这次想分享的是使用mina框架自定义编解码器,实现发送纯文本和非纯文本消息,带PBE加密。        首先定义要发送的信...
  • u011102153
  • u011102153
  • 2015年04月21日 21:43
  • 1215

socket 通信的解决方案-Mina框架的使用心得及相关要点

前言 笔者之前的工作主要是做 java 的 web 端开发,后因工作原因参与了一个国家级的大项目,主要负责其中底层通讯的前置机模块。几经波折,将该系统完成后,结果在第一轮的测试中就惨败退回。其根本原...
  • libing13810124573
  • libing13810124573
  • 2016年04月21日 10:35
  • 2065

Mina框架断包、粘包问题解决方案

Mina框架断包、粘包问题解决方案 Apache Mina Server 是一个网络通信应用框架,也就是说,它主要是对基于TCP/IP、UDP/IP协议栈的通信框架(当然,也可以提供JAVA 对...
  • rchm8519
  • rchm8519
  • 2014年08月07日 14:38
  • 22140
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:MINA通信deCode实现
举报原因:
原因补充:

(最多只允许输入30个字)