mina 自定义包的解析

首先定义自动定义的包类

package com.lianshang.findme.common.message;


import java.nio.charset.CharacterCodingException;
import java.nio.charset.Charset;
import java.nio.charset.CharsetDecoder;
import java.nio.charset.CharsetEncoder;


import org.apache.mina.core.buffer.IoBuffer;


import com.lianshang.findme.common.opcode.MsgCode;


public class MessagePackage
{
private int opcode;
private int length;
private IoBuffer stream;
private Charset charset;


public MessagePackage()
{
charset = Charset.forName("utf-8");
clear();
}

public MessagePackage(Charset _charset)
{
charset = _charset;
clear();
}

public void clear()
{
opcode = MsgCode.CODE_BEGIN;
length = 0;
stream = IoBuffer.allocate(100).setAutoExpand(true);
}
public void readBuffer(IoBuffer in)
{
opcode = in.getInt();
length = in.getInt(); 
byte[] data = new byte[length];
in.get(data);

stream.put(data);
stream.flip();
}

public void writeBuffer(IoBuffer out)
{
out.putInt(opcode);
out.putInt(length);
byte[] data = new byte[length];
stream.get(data);
out.put(data);
}

public void flip()
{
stream.flip();
length = stream.remaining(); 
}

public void putString (String _String)
{
CharsetEncoder encoder = charset.newEncoder();
try
{
int length =_String.getBytes().length;
stream.putInt(length);
stream.putString(_String,encoder);
} catch (CharacterCodingException e)
{
e.printStackTrace();
}
}

public String getString()
{
CharsetDecoder decoder = charset.newDecoder();
int length = stream.getInt();

String _str = null;
try
{
_str = stream.getString(length,decoder);
} catch (CharacterCodingException e)
{
e.printStackTrace();
}
return _str;
}

public void putBoolean(boolean val)
{
byte a = (byte) (val ? 1 : 0);
stream.put(a);
}
public boolean getBoolean()
{
return stream.get() == ((byte)1);
}

public void putInt(int val)
{
stream.putInt(val);
}
public int getInt()
{
return stream.getInt();
}

public void putDouble(double val)
{
stream.putDouble(val);
}
public double getDouble()
{
return stream.getDouble();
}

public int getOpcode()
{
return opcode;
}


public void setOpcode(int opcode)
{
this.opcode = opcode;
}


public int getLength()
{
return length;
}

public String toString()
{
return "\n"+"opcode:"+opcode+"DataLength:"+length;
}


}

再定义Decode 和Encode

package com.lianshang.findme.common.message;


import org.apache.mina.core.buffer.IoBuffer;
import org.apache.mina.core.session.IoSession;
import org.apache.mina.filter.codec.ProtocolDecoderOutput;
import org.apache.mina.filter.codec.demux.MessageDecoder;
import org.apache.mina.filter.codec.demux.MessageDecoderResult;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;


import com.lianshang.findme.common.opcode.MsgCode;


public class MyMessageDecoder implements MessageDecoder
{
private Logger logger = LoggerFactory.getLogger(MyMessageDecoder.class);


public MyMessageDecoder()
{
}


// 检查给定的IoBuffer是否适合解码
public MessageDecoderResult decodable(IoSession session, IoBuffer in)
{
// 报头长度==8
if (in.remaining() < 8)
{
return MessageDecoderResult.NEED_DATA;
}


int opcode = in.getInt();
if (opcode > MsgCode.CODE_BEGIN && opcode < MsgCode.CODE_COUNT)
{
//logger.info("请求标识符:" + opcode);
} else
{
logger.error("未知的解码类型....");
return MessageDecoderResult.NOT_OK;


// 真实数据长度
int len = in.getInt();
if (in.remaining() < len)
{
return MessageDecoderResult.NEED_DATA;
}
return MessageDecoderResult.OK;
}


public MessageDecoderResult decode(IoSession session, IoBuffer in,
ProtocolDecoderOutput out) throws Exception
{
MessagePackage message = new MessagePackage();
message.readBuffer(in);
out.write(message);
return MessageDecoderResult.OK;
}


public void finishDecode(IoSession session, ProtocolDecoderOutput out)
throws Exception
{


}
}


package com.lianshang.findme.common.message;




import org.apache.mina.core.buffer.IoBuffer;
import org.apache.mina.core.session.IoSession;
import org.apache.mina.filter.codec.ProtocolEncoderOutput;
import org.apache.mina.filter.codec.demux.MessageEncoder;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;


public class MyMessageEncoder implements MessageEncoder<MessagePackage>
{
private Logger logger = LoggerFactory.getLogger(MyMessageEncoder.class);


public MyMessageEncoder()
{


}


public void encode(IoSession session, MessagePackage message,
ProtocolEncoderOutput out) throws Exception
{
IoBuffer buf = IoBuffer.allocate(100).setAutoExpand(true);
message.writeBuffer(buf);
buf.flip();
out.write(buf);
}
}

--------------------

coderfactory

package com.lianshang.findme.common.message;




import org.apache.mina.filter.codec.demux.DemuxingProtocolCodecFactory;
import org.apache.mina.filter.codec.demux.MessageDecoder;
import org.apache.mina.filter.codec.demux.MessageEncoder;


public class MyMessageCodecFactory extends DemuxingProtocolCodecFactory
{
private MessageDecoder decoder;
private MessageEncoder<MessagePackage> encoder;


// 注册编解码器
public MyMessageCodecFactory(MessageDecoder decoder,
MessageEncoder<MessagePackage> encoder)
{
this.decoder = decoder;
this.encoder = encoder;
addMessageDecoder(this.decoder);
addMessageEncoder(MessagePackage.class, this.encoder);
}
}


添加自定义的过滤器

final IoConnector connector = new NioSocketConnector();
// 创建连接
// 设置链接超时时间
connector.setConnectTimeoutMillis(10000);
// 添加过滤器
connector.getFilterChain().addLast(
// 添加消息过滤器
"codec",
new ProtocolCodecFilter(new MyMessageCodecFactory(
new MyMessageDecoder(), new MyMessageEncoder())));



大功告成,自定义的消息过滤器搞定,有不明白的同学可以留言交流

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值