3、针对服务端通信规则重写编解码方法,支持断包粘包

public class ClientDecoder extends CumulativeProtocolDecoder {
 public static Logger logger = Logger.getLogger(ClientDecoder.class);
 @Override
 protected boolean doDecode(IoSession session, IoBuffer in,
   ProtocolDecoderOutput out) throws Exception {
  IoBuffer buf = IoBuffer.allocate(0).setAutoExpand(true);
  IoBuffer buffer = IoBuffer.allocate(0).setAutoExpand(true);
  byte [] head = new byte[16];
  logger.info(in.remaining());
  if (in.remaining() > 0) {
   int msgLen = 16;// 16字节判断消息长度
   if (in.remaining() > msgLen) {
    in.mark();   
    in.get(head, 0, 16);   
    buf.put(XorParamCodec.decryptXOR(head));
    buf.flip();
    int length=buf.getInt();
    if (length - msgLen > in.remaining()) {
     in.reset();
     return false;
    } else {
     in.position(0);
     while (in.hasRemaining()) {
      buffer.put(in.get());
     }
     buffer.flip();
     out.write(buffer);
     return false;
    }
   }
  }
  return false;
 }

}

  4、编写Test发送数据

@Before
 public void beforeTest() {
  ip = PropertiesHandle.readValue("ip");
  port = Integer.valueOf(PropertiesHandle.readValue("port"));
  mmc = new MyMinaClient();
 }
 
 @Test
 public void testUpdate() throws Exception {

  IoConnector connector = mmc.creatClient();
  IoSession session = mmc.getIoSession(connector, ip, port);
  mmc.sendMsg(session, ClientRegister.getRegisterInfo()); \ClientRegister和ClientUpdate类是客户端发送的数据
            mmc.sendMsg(session, ClientUpdate.getUpdateInfo());
  mmc.close(session, connector);
  Assert.assertEquals(AcctGuardData.Registerr_Rec, HeaderInfo.response);
 }