Browse Source

减少两出bytebuf的复制

xiuwei 3 years ago
parent
commit
933a6860ea

+ 7 - 6
protocol-core/src/main/java/wei/yigulu/netty/AbstractDelimiterHandler.java

@@ -5,6 +5,7 @@ import io.netty.buffer.ByteBuf;
 import io.netty.buffer.ByteBufUtil;
 import io.netty.channel.ChannelHandlerContext;
 import io.netty.channel.ChannelInboundHandlerAdapter;
+import io.netty.util.ReferenceCountUtil;
 import lombok.Getter;
 import lombok.Setter;
 import lombok.experimental.Accessors;
@@ -13,6 +14,8 @@ import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import wei.yigulu.utils.DataConvertor;
 
+import java.awt.image.DataBuffer;
+
 /**
  * 未继承netty的数据帧处理拆包类
  *
@@ -64,13 +67,9 @@ public abstract class AbstractDelimiterHandler extends ChannelInboundHandlerAdap
 	 * @return {@link ByteBuf}
 	 */
 	protected static ByteBuf expandCumulation(ByteBuf byteBuf1, ByteBuf byteBuf2) {
-		ByteBuf oldCumulation = byteBuf1;
-		byteBuf1 = byteBuf1.alloc().buffer(oldCumulation.readableBytes() + byteBuf2.readableBytes());
-		byteBuf1.writeBytes(oldCumulation);
+		byteBuf1.discardReadBytes();
+		byteBuf1.ensureWritable(byteBuf2.readableBytes());
 		byteBuf1.writeBytes(byteBuf2);
-		byteBuf1.readerIndex(0);
-		while (!oldCumulation.release()) {
-		}
 		while (!byteBuf2.release()) {
 		}
 		return byteBuf1;
@@ -151,6 +150,8 @@ public abstract class AbstractDelimiterHandler extends ChannelInboundHandlerAdap
 			while (!cumulation.release()) {
 			}
 			cumulation = null;
+			while (!byteBuf.release()) {
+			}
 			log.warn("报文超长舍弃");
 			return true;
 		} else {

+ 2 - 4
protocol-core/src/main/java/wei/yigulu/utils/DataConvertor.java

@@ -1,6 +1,7 @@
 package wei.yigulu.utils;
 
 import io.netty.buffer.ByteBuf;
+import io.netty.buffer.ByteBufUtil;
 import io.netty.util.ReferenceCountUtil;
 
 import java.util.Formatter;
@@ -55,10 +56,7 @@ public class DataConvertor {
 		if (!buf.isReadable()) {
 			return null;
 		}
-		ByteBuf b1 = buf.copy();
-		byte[] bs = new byte[b1.readableBytes()];
-		b1.readBytes(bs);
-		ReferenceCountUtil.release(b1);
+		byte[] bs=ByteBufUtil.getBytes(buf);
 		return Byte2String(bs);
 	}
 

+ 8 - 22
protocol-iec104/src/test/java/ClientTest.java

@@ -1,14 +1,6 @@
-
-import io.netty.channel.nio.AbstractNioByteChannel;
-import org.joda.time.DateTime;
 import wei.yigulu.iec104.apdumodel.Apdu;
-import wei.yigulu.iec104.apdumodel.Asdu;
-import wei.yigulu.iec104.asdudataframe.ProofreadTimeType;
-import wei.yigulu.iec104.asdudataframe.typemodel.IeProofreadTime;
-import wei.yigulu.iec104.asdudataframe.typemodel.InformationBodyAddress;
 import wei.yigulu.iec104.nettyconfig.Iec104HSMasterBuilder;
 import wei.yigulu.iec104.util.SendDataFrameHelper;
-import wei.yigulu.utils.DataConvertor;
 
 
 /**
@@ -20,19 +12,13 @@ import wei.yigulu.utils.DataConvertor;
  **/
 public class ClientTest {
 
-
-    public static void main(String[] args) throws Exception {
-       Iec104HSMasterBuilder a = new Iec104HSMasterBuilder("127.0.0.1", 2404);
-        a.createByUnBlock();
-       // AbstractNioByteChannel
-        Thread.sleep(5000L);
-        /*for (;;){
-            Thread.sleep(3000L);
-            System.out.println( );
-            SendDataFrameHelper.sendTotalSummonFrame(a.getFuture().channel(),1,6,a.getLog());
-        }*/
-
-    }
-
+	public static void main(String[] args) throws Exception {
+		Iec104HSMasterBuilder iec104HSMasterBuilder = new Iec104HSMasterBuilder("192.168.1.206", 2405);
+				iec104HSMasterBuilder.createByUnBlock();
+		/*Apdu apdu=new Apdu();
+		iec104HSMasterBuilder.sendFrameToOpposite(apdu.encode());
+		SendDataFrameHelper.sendTotalSummonFrame(iec104HSMasterBuilder.getFuture().channel(),1,6,iec104HSMasterBuilder.getLog());
+		System.out.println(123);*/
+	}
 
 }