解码器。decodable函数判断当前的字节流是否足够解码,decode函数进行解码操作,生成消息对象。
package minabase.server;
import java.nio.charset.CharacterCodingException;
import java.nio.charset.Charset;
import java.nio.charset.CharsetDecoder;
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;
/**
* Class Description: 解码器
* Copyright: Copyright (c)
*
*/
public class MyCodecDecoder implements MessageDecoder
{
private Charset charset = Charset.forName("UTF-8");
/**
* 编码规则
*/
private CharsetDecoder decoder;
public MyCodecDecoder(Charset charset)
{
decoder = charset.newDecoder();
}
@Override
public MessageDecoderResult decodable(IoSession session, IoBuffer in)
{
try
{
String allData = in.getString(decoder);
if (allData.contains("\n"))
{
return MessageDecoderResult.OK;
}
else
{
return MessageDecoderResult.NEED_DATA;
}
}
catch (CharacterCodingException e)
{
System.out.println("error: " + e);
}
return MessageDecoderResult.OK;
}
@Override
public MessageDecoderResult decode(IoSession session, IoBuffer in, ProtocolDecoderOutput out)
{
IoBuffer buf = IoBuffer.allocate(100).setAutoExpand(true);
while (in.hasRemaining())
{
byte b = in.get();
buf.put(b);
if (b == '\n')
{
buf.flip();
byte[] msg = new byte[buf.limit()];
buf.get(msg);
String strMsg = new String(msg, charset);
out.write(strMsg);
break;
}
}
return MessageDecoderResult.OK;
}
@Override
public void finishDecode(IoSession arg0, ProtocolDecoderOutput arg1)
throws Exception
{
}
}