package com.dy.testClient.tcpConnect; import java.io.*; import org.apache.mina.core.buffer.IoBuffer; import org.apache.mina.core.session.IoSession; import org.apache.mina.filter.codec.CumulativeProtocolDecoder; import org.apache.mina.filter.codec.ProtocolDecoderOutput; import com.am.cs12.command.*; public class LocalDecoder extends CumulativeProtocolDecoder { private static final String DECODER_STATE_KEY = LocalDecoder.class.getName() + ".STATE"; public static final int MAX_SIZE = 2147483647 ; private class DecoderState { Command com; } /** * 对网络传输来的数据进行解码 */ protected boolean doDecode(IoSession session, IoBuffer in, ProtocolDecoderOutput out) throws IOException, Exception{ //从会话中得到已经解码的数据 DecoderState decoderState = (DecoderState) session.getAttribute(DECODER_STATE_KEY); if (decoderState == null) { decoderState = new DecoderState(); session.setAttribute(DECODER_STATE_KEY, decoderState); } if (decoderState.com == null) { //试着读取命令区域数据 //MAX_IMAGE_SIZE 目的是防止大数据量攻击 if (in.prefixedDataAvailable(4, MAX_SIZE)) { decoderState.com = readCommand(in); } else { //命令区域无足够的数据 return false; } } if (decoderState.com != null) { //试着读取数据(文件)区域数据 //MAX_IMAGE_SIZE 目的是防止大数据量攻击 if (in.prefixedDataAvailable(4, MAX_SIZE)) { byte[] bs = getDataBytes(in); MinaData minaCom = new MinaData() ; minaCom.setCom(decoderState.com) ; minaCom.setAttachment(bs) ; out.write(minaCom); decoderState.com = null; return true; } else { //数据(文件)区域无足够的数据 return false; } } return false; } /** * 读取Command命令 * @param in * @return * @throws IOException */ private Command readCommand(IoBuffer iob) throws IOException , Exception{ int length = iob.getInt(); byte[] bytes = new byte[length]; iob.get(bytes); Command com = new Command().toObject(bytes); return com; } /** * 得到数据域数据的字节数组 * @param in * @return * @throws IOException */ private byte[] getDataBytes(IoBuffer iob) throws IOException { int length = iob.getInt(); if(length == 0){ return null ; } byte[] bytes = new byte[length]; iob.get(bytes); return bytes ; } }