要求经过utf-8编码显示数据长度和版本号和标志 加上json字符串转成的指令数据包 他们一起叫做明文数据包
就是怎么把他们放在一起呢
你应该先发这个图啊!!!!
我给你的报文结构,是没有要求情况下,重0开始设计的;图中是已经设计好的报文结构,就按这个结构开发。。。
示意代码,只表示思路
StringBuffer sb = new StringBuffer();
sb.append("1");//1个字节版本号
sb..append("A“);//1个字节标志
sb.append("xxxxxxxxxx");//加密指令包
int length = sb.toString().getBtyes("Utf-8“”).length();//指令包长度, 这个长度是否包含版本号,标志看要求
String message = length + sb.toString();//发送的消息
最后的报文
xxxx1A000000000000000000000000000000000000000000000000000000
还有不用KeyGenerator 生成key的,不知道是不是你要的
这里key必须是16或24的,你的key明显不是这两个值,不晓得要怎样用
private static byte[] des3EncodeCBC(String key, byte[] keyiv, byte[] data) throws Exception {
Security.addProvider(new BouncyCastleProvider());
// Key deskey = keyGenerator(new String(key));
SecretKey deskey = new SecretKeySpec(key.getBytes(), "DESede");
Cipher cipher = Cipher.getInstance("DESEDE/CBC/PKCS7Padding");
IvParameterSpec ivs = new IvParameterSpec(keyiv);
System.out.println("iv为"+ ivs);
cipher.init(Cipher.ENCRYPT_MODE, deskey, ivs);
byte[] bOut = cipher.doFinal(data);
for (int k = 0; k < bOut.length; k++) {
System.out.print(bOut[k] + " ");
}
System.out.println("");
return bOut;
}
或许你应该了解下,tcp/ip协议栈,再了解下数据帧,再了解下网络传输,
应该你就明白了。
socket通信,要解决一下首要问题是,消息到哪里结束;
通常我们约定报文前4个字节代表本次报文正式内容的字节长度,这个4个字节代表一个int型数据,不是一个字符串数字;区别在于int型可以表示21亿,4个字节数字字符串只可以表示到9999不够用。读取消息时,先读4个字节获取消息长度,然后按这个长度读取完整消息内容。这样就可以不多不少的获取消息内容
根据你的需求,明文数据包可以设计成有3个的json字符串,一个是版本号,一个是标志,一个是json字符串格式的消息指令包;
然后把明文数据包转成json字符串,再用getBtyes("utf-8"),转成字节数数组;计算字节数组长度后,再拼在明文数据包前面,做完完整的消息,发送出去;
接收方先收取前4个字节,获取消息长度;然后根据长度获取消息内容,再转字符串。这个字符串是json格式,可以提取出版本号,标志,指令包等信息进行后续处理