private int send(SocketChannel socketChannel, ByteBuffer dataBuffer) throws IOException {
    int sendSize = socketChannel.write(dataBuffer);

    if (sendSize > 0) {
      channelContext.getStatVo().setCurrentSendTime(SystemTimer.currentTimeMillis());
      channelContext.getStatVo().setSentBytes(sendSize + channelContext.getStatVo().getSentBytes());
      StatVo.getAllSentBytes().addAndGet(sendSize);

      getProcessedMsgByteCount().addAndGet(sendSize);
    }

    return sendSize;
  }
  /**
   * @param data 要发送的数据
   * @param socketChannel 发往的通道
   * @return 数据发送成功:true;失败:false
   * @throws IOException
   */
  private boolean sendData(byte[] data, SocketChannel socketChannel) throws IOException {
    try {
      ByteBuffer dataBuffer = ByteBuffer.wrap(data);

      long sendSize = send(socketChannel, dataBuffer);
      long allSendSize = sendSize;
      long starttime = SystemTimer.currentTimeMillis();

      while (dataBuffer.hasRemaining()
          && socketChannel.isOpen()) // 还有数据没写干净,一般是网络不好导致,也可能是发送和接收量太大。
      {
        sendSize = send(socketChannel, dataBuffer);

        if (sendSize == 0) {
          Thread.sleep(5);
        } else {
          allSendSize += sendSize;
        }

        if (DebugUtils.isNeedDebug(channelContext)) {
          try {
            long endtime = SystemTimer.currentTimeMillis();
            long costtime = (endtime - starttime);
            double speed = -1;
            if (costtime > 0) {
              speed = allSendSize / costtime;
            }

            log.error(
                "{} bytes was sent, {}/{}({}%), cost time: {} ms, {}bytes/ms,{}",
                sendSize,
                allSendSize,
                data.length,
                (allSendSize * 100) / data.length,
                costtime,
                speed,
                channelContext);
          } catch (Exception e) {
            log.error(e.getLocalizedMessage(), e);
          }
        }
      }
      StatVo.getAllSentMsgCount().incrementAndGet();
      this.getProcessedMsgCount().incrementAndGet();
      long endtime = SystemTimer.currentTimeMillis();

      if (DebugUtils.isNeedDebug(channelContext)) {
        try {
          long costtime = (endtime - starttime);
          double speed = -1;
          if (costtime > 0) {
            speed = allSendSize / costtime;
          }
          log.error("cost time: {} ms, {}bytes/ms, {}", costtime, speed, channelContext);

          log.error(
              "ok sent to "
                  + channelContext
                  + ",total num["
                  + StatVo.getAllSentMsgCount().get()
                  + "],num to this ["
                  + getProcessedMsgCount().get()
                  + "],waiting for send to this ["
                  + getMsgQueue().size()
                  + "]");
        } catch (Exception e) {
          log.error(e.getLocalizedMessage(), e);
        }
      }

      return true;
    } catch (InterruptedException e) {
      return false;
    }
  }