在基于TCP框架使用netty框架时,接受的数据由于不断地在缓冲区中存放,不可避免的会出现拆包的问题。
解决思路:每一个ip所发生的数据一定是连贯的,所以把ip作为key值,msg作为value值存放在Map集合中
private static Map<String,StringBuffer> currMap = new ConcurrentHashMap<>();
获取发送信息的ip地址
String ip = ctx.channel().remoteAddress().toString();
如果该ip第一次接收,则新生成一个线程安全的StringBuffer,否则将信息拼接到缓冲区末尾。
if( currMap.get(ip) == null ){
currMap.put(ip ,new StringBuffer(msg.toString()));
} else {
currMap.get(ip).append(msg);
}
在每一条完整的数据末尾,以“*$”特殊符号作为结束符。
String[] msgStr = currMap.get(ip).toString().split("\\$");
StringBuffer stringBuffer = new StringBuffer();
for (int j = 0; j < msgStr.length; j++) {
if(j==msgStr.length-1){
if(!msgStr[j].endsWith("*")){
stringBuffer.append(msgStr[j]);
currMap.put(ip,stringBuffer);
continue;
} else {
currMap.clear();
currMap.put(ip,stringBuffer);
}
}
将value值中得字符串取出进行分割为若干条完整的数据,不完整的数据再次放入缓冲区中。
之后将每一条完整数据再进行业务处理。
并发测试时,数据正确接收。
按道理来讲,应该是没有问题的。如有考虑不到的地方,还请各位指正。