From e231aa866133376a361c558047da56b12b99253d Mon Sep 17 00:00:00 2001 From: free will <2647778488@qq.com> Date: Mon, 25 Oct 2021 23:38:09 +0800 Subject: [PATCH] =?UTF-8?q?=E8=AF=95=E5=9B=BE=E5=AE=9E=E7=8E=B0=E4=B8=80?= =?UTF-8?q?=E4=B8=AAquickSend()?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/logicface/LinkService.java | 79 +++++++++++++++++++ src/main/java/logicface/LogicFace.java | 10 +++ .../java/mgmt/RegisterPrefixHelperTest.java | 42 +++++++++- 3 files changed, 129 insertions(+), 2 deletions(-) diff --git a/src/main/java/logicface/LinkService.java b/src/main/java/logicface/LinkService.java index 3feea44..3fea8cf 100644 --- a/src/main/java/logicface/LinkService.java +++ b/src/main/java/logicface/LinkService.java @@ -7,6 +7,7 @@ import packet.*; import util.ByteHelper; import java.util.Arrays; +import java.util.concurrent.ConcurrentLinkedQueue; /* * @Author: Wang Feng @@ -25,6 +26,9 @@ public class LinkService { public int lpPacketHeadSize; // lpPacket 编码成数组时的头部大小 public long lpPacketId; // 发送的lpPacket 编码 + // 测试去掉一个encoder之后,是否发包变快 + public byte[] cpacketBytes; + /** * 计算lpPacket头部大小 */ @@ -57,6 +61,37 @@ public class LinkService { this.mtu=mtu; this.calculateLpPacketHeadSize(); this.lpPacketId=0; + // todo:测试 + Identifier serverIden = null; + try { + serverIden=new Identifier("/testsrc"); + } catch (ComponentException e) { + e.printStackTrace(); + return; + } + CPacket cPacket=new CPacket(); + cPacket.setSrcIdentifier(serverIden); + cPacket.setDstIdentifier(serverIden); + cPacket.ttl.setTtl(64); + byte[] pay=new byte[1000]; + cPacket.payload.setValue(pay); + ConcurrentLinkedQueue readTunCPackets = new ConcurrentLinkedQueue<>(); + for (int i = 0; i < 100000; i++) { + readTunCPackets.offer(cPacket); + } + Encoder encoder=new Encoder(); + try { + if(!encoder.encoderReset(new SizeT(Encoder.MaxPacketSize),new SizeT(0))){ + } + } catch (EncoderException e) { + e.printStackTrace(); + } + try { + int bufLen=cPacket.wireEncode(encoder); + } catch (PacketException e) { + e.printStackTrace(); + } + cpacketBytes=encoder.getBuffer(); } /** @@ -206,6 +241,50 @@ public class LinkService { } } + /** + * 快发一个推式包:直接默认要发的cpacket只打包成一个lppacket,快速将它发出去 + * @param cPacket + * @return + * @throws LogicFaceException + */ + public boolean sendQuickCPacket(CPacket cPacket) throws LogicFaceException { + try { + LpPacket lpPacket=getLpPacketFromCPacket(cPacket); + if(lpPacket!=null) { + return this.transport.send(lpPacket); + }else { + return false; + } + } catch (LogicFaceException e) { + throw new LogicFaceException("LinkService.sendCPacket: "+e.getMessage()); + } + } + + private LpPacket getLpPacketFromCPacket(CPacket cPacket) throws LogicFaceException { + try { +// // 1.CPacket => byte[] +// Encoder encoder=new Encoder(); +// if(!encoder.encoderReset(new SizeT(Encoder.MaxPacketSize),new SizeT(0))){ +// return null; +// } +// int bufLen=cPacket.wireEncode(encoder); +// byte[] buf=encoder.getBuffer(); + + // 2.byte[] => LpPacket + LpPacket lpPacket=new LpPacket(); + lpPacket.setId(this.lpPacketId); + lpPacket.setFragmentNum(1); //分片数 + lpPacket.setFragmentSeq(0); //片序号 + lpPacket.setValue(cpacketBytes); + + this.lpPacketId++; + return lpPacket; +// } catch (PacketException | EncoderException e) { + } catch (Exception e) { + throw new LogicFaceException("LinkService.getMINPacketFromLpPacket: "+e.getMessage()); + } + } + /** * 发送一个MIN网络包 * @param minPacket diff --git a/src/main/java/logicface/LogicFace.java b/src/main/java/logicface/LogicFace.java index bdb53ae..6a2e812 100644 --- a/src/main/java/logicface/LogicFace.java +++ b/src/main/java/logicface/LogicFace.java @@ -302,6 +302,16 @@ public class LogicFace { return this.linkService.sendCPacket(cPacket); } + /** + * 快发包(暂时仅支持TCP):减少打包过程,迅速将包发送出去 + * @param cPacket + * @return + * @throws LogicFaceException + */ + public boolean sendQuickCPacketByTCP(CPacket cPacket) throws LogicFaceException { + return this.linkService.sendQuickCPacket(cPacket); + } + /** * 发送一个兴趣包 * @param interest diff --git a/src/test/java/mgmt/RegisterPrefixHelperTest.java b/src/test/java/mgmt/RegisterPrefixHelperTest.java index 75af90d..60bea73 100644 --- a/src/test/java/mgmt/RegisterPrefixHelperTest.java +++ b/src/test/java/mgmt/RegisterPrefixHelperTest.java @@ -7,8 +7,11 @@ import examples.TestKeyManagerExample; import logicface.LogicFace; import logicface.LogicFaceException; import org.junit.Test; +import packet.CPacket; import security.KeyChain; +import java.util.concurrent.ConcurrentLinkedQueue; + /* * @Author: Wang Feng @@ -24,8 +27,7 @@ public class RegisterPrefixHelperTest { Identifier identifier=new Identifier("/hello/wefree"+System.currentTimeMillis()); // 初始化face LogicFace face=new LogicFace(); -// face.initWithUdp("127.0.0.1",14922); - face.initWithUdp("14.215.134.202",14922); + face.initWithTcp("14.215.134.202",14922); // 初始化KeyChain // KeyChain keyChain=new KeyChain(); @@ -33,6 +35,42 @@ public class RegisterPrefixHelperTest { KeyManagerExample.INSTANCE.initKeyChain("/wefree/test","D://"); face.setKeyChain(KeyManagerExample.INSTANCE.getKeyChain()); helper.registerPrefix(identifier,face,KeyManagerExample.INSTANCE.getKeyChain()); + + // 测试发包速率 + Identifier serverIden = null; + try { + serverIden=new Identifier("/testsrc"); + } catch (ComponentException e) { + e.printStackTrace(); + return; + } + CPacket cPacket=new CPacket(); + cPacket.setSrcIdentifier(serverIden); + cPacket.setDstIdentifier(serverIden); + cPacket.ttl.setTtl(64); + byte[] pay=new byte[1000]; + cPacket.payload.setValue(pay); + ConcurrentLinkedQueue readTunCPackets = new ConcurrentLinkedQueue<>(); + for (int i = 0; i < 100000; i++) { + readTunCPackets.offer(cPacket); + } + + // 发包计数 + int nums=100000; + int error=0; + long startTime=System.currentTimeMillis(); + for (int i = 0; i < nums; i++) { + // 出队 + CPacket newPacket = readTunCPackets.poll(); + if(newPacket!=null) { + face.sendQuickCPacketByTCP(newPacket); +// face.sendCPacket(newPacket); + } + } + System.out.println("nums: "+nums); + long endtime=System.currentTimeMillis(); + System.out.println("发包"+nums+"耗时: "+(endtime-startTime)+"毫秒"); + System.out.println(readTunCPackets.size()); } @Test