粘包處理主要用于指令批量接收的時候可能會出現不完整包的情況
這里以這樣的協議指令為例:
幀頭+數據長度+實際數據+校驗和+幀尾
/**
? * 黏包處理
? **/
private static String tempCmd="";//臨時半包指令內容,用于指令拼接
//獲取正式的數據
public static String[] ?getTrueData(String data,String head,String end) {
? ? ? ? ? ?data = data.toLowerCase();
? ? ? ? ? ?boolean ?endFlag = end.equals(data.substring(data.length() -2,data.length()));
? ? ? ? ? ?String[] s =new ?String[stringSub(data,end + head) +1];
? ? ? ? ? ?int ?num =0;
? ? ? ? ? for(inti =0;i < s.length;i++) {
? ? ? ? ? ? ? ? ? data = data.substring(num);
? ? ? ? ? ? ? ? ? num = data.indexOf(end + head) +2;
? ? ? ? ? ? ? ? ?if(num ==1) {
? ? ? ? ? ? ? ? ? ? ? ? ?num = data.length();
? ? ? ? ? ? ? ? ? ?}
? ? ? ? ? ? ? ? ?if(i ==0) {
? ? ? ? ? ? ? ? ? ? ? ?String t = data.substring(0,num);
? ? ? ? ? ? ? ? ? ? ? ?if(t.substring(0,2).equals(head)) {
? ? ? ? ? ? ? ? ? ? ? ?tempCmd="";
? ? ? ? ? ? ? ? ?}
? ? ? ? ? ? ? ? s[0] =tempCmd+ t;
? ? ? ? ?}else{
? ? ? ? ? ? ? ?s[i] = data.substring(0,num);
? ? ? ? ? ? ? ?if(i == (s.length-1) && (!endFlag)) {
? ? ? ? ? ? ? ? ? ? ? tempCmd= s[i];
? ? ? ? ? ? ? ?}
? ? ? ? }
}
? return s;
}