From 212931ff2bb2c2060e9a873aa8392d9ccae4f7fd Mon Sep 17 00:00:00 2001 From: free will <2647778488@qq.com> Date: Fri, 17 Dec 2021 15:27:38 +0800 Subject: [PATCH] =?UTF-8?q?=E5=9C=A8VMSConnection=E6=A8=A1=E5=9D=97?= =?UTF-8?q?=E4=B8=AD=E7=9A=84BC=5FEncoder=E7=B1=BB=E4=B8=AD=E5=8A=A0?= =?UTF-8?q?=E5=85=A5=E9=AD=94=E6=95=B0=EF=BC=8C=E5=87=8F=E5=B0=91=E6=9C=8D?= =?UTF-8?q?=E5=8A=A1=E5=99=A8=E7=AB=AF=E7=9A=84=E5=86=85=E5=AD=98error?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../VMSConnection/Encoding/BC_Encoder.java | 37 ++++++++++++++++--- 1 file changed, 32 insertions(+), 5 deletions(-) diff --git a/src/main/java/VMSConnection/Encoding/BC_Encoder.java b/src/main/java/VMSConnection/Encoding/BC_Encoder.java index 7ec52aa..a528be2 100644 --- a/src/main/java/VMSConnection/Encoding/BC_Encoder.java +++ b/src/main/java/VMSConnection/Encoding/BC_Encoder.java @@ -13,16 +13,23 @@ import java.nio.channels.SocketChannel; * @Copyright: MIN-Group;国家重大科技基础设施——未来网络北大实验室;深圳市信息论与未来网络重点实验室 */ public class BC_Encoder { + // 魔数:为了避免读取数据时,因为读错开始的数据长度,而导致后台分配一块巨大的内存,出现内存错误 + final static int magicNumber = 1803118696; // 后台设定的数字为uint32:0x6b796868 + // 转为byte[]的魔数。小端字节序,4个字节 + final static byte[] magicNumberBytes = ByteHelper.int32ToByteArray(magicNumber); + /** * Encode 将消息编码: 加一个长度头 + * | 魔数 | length | data | * @param message * @return */ public static byte[] Encode(byte[] message){ byte[] length= ByteHelper.int32ToByteArray(message.length); - byte[] pkg=new byte[4+ message.length]; - System.arraycopy(length,0,pkg,0,4); - System.arraycopy(message,0,pkg,4,message.length); + byte[] pkg=new byte[4+4+ message.length]; + System.arraycopy(magicNumberBytes,0,pkg,0,4); + System.arraycopy(length,0,pkg,4,4); + System.arraycopy(message,0,pkg,8,message.length); return pkg; } @@ -43,6 +50,26 @@ public class BC_Encoder { } } System.out.println("start read..."); + // 魔数 + byte[] magicBuf=new byte[4]; + try { + int revL=channel.socket().getInputStream().read(magicBuf); +// channel.read(ByteBuffer.wrap(buf)); + if(revL<0){ + System.out.println("magic read len < 0"); + return null; + } + } catch (IOException e) { + e.printStackTrace(); + return null; + } + int magicServerNumber=ByteHelper.byteArrayToInt32(magicBuf); + System.out.println("read magic number form server: "+magicServerNumber); + if(magicServerNumber!=magicNumber){ + System.out.println("the magic number error: "+magicServerNumber + +", it should be "+magicNumber); + return null; + } // 读取消息的长度 byte[] buf=new byte[4]; try { @@ -57,7 +84,7 @@ public class BC_Encoder { return null; } int length=ByteHelper.byteArrayToInt32(buf); - System.out.println("read 111: "+length); + System.out.println("read 111-length: "+length); // 读取真正的消息数据 byte[] pkg=new byte[length]; // 最终读取的数据区 byte[] cachepkg=new byte[length]; // 缓存数据区 @@ -84,7 +111,7 @@ public class BC_Encoder { return null; } } - System.out.println("read 222: "+new String(pkg)); + System.out.println("read 222-pkg: "+new String(pkg)); return pkg; } }