这个问题曾经困扰姐很久,但因为只是延时,而数据仍然正确,就将这个问题放在一边了。
昨天开始研究,以为是IO包没有NIO包快的原因,昨天改用NIO socket,写完一测,仍然有严重的延时呀。
姐差点傻眼,不过还好姐聪明,原来是姐缓存的数据没有全部处理掉呀,而是在等下次有数据进来的时候才处理,那些聊天消息其实早就发来了,被姐藏着呢。
哎,终于轻松了许多。
贴点代码出来现现眼吧
ps : 姐用的是google protobuf协议呦
private int dataState = 0;// 上一次收到消息后得到的状态 (初始时为 0 )
private final int EQUAL = 0;//正好
private final int LACK = 1;//少了
private final int OVER = 2;//多了
private byte[] fromLastBytes; //上次剩余的
private int overLast;// 上次剩余的长度
private byte[] savedBytes;// 不够,保存在lackedBytes里,等待下次传入数据后拼接
private byte[] exactBytes; // 正好的也是最终要处理的
private void handleServerMessage(byte[] temp, int count) {
System.out.println("***************接收服务端信息***************** start " + count);
// System.out.println("上次信息情况: dataState : " + dataState );
//
// if(dataState == OVER)System.out.println("上次信息剩余: overLast : " + overLast);
// if(dataState == LACK)System.out.println("上次信息缺少 savedBytes.length : " + savedBytes.length);
byte[] bytes = null;
if(dataState == EQUAL) // 1:第一次有消息进来 2:本次消息之前 传入及所需相等
{
bytes = new byte[count];
for(int i = 0; i < count; i++)
{
bytes[i] = temp[i];
}
}else if (dataState == LACK) {//上次消息不够 : 上次保留的 + 本次传入的
bytes = new byte[savedBytes.length + count];
for(int i = 0; i<savedBytes.length; i++)
{
bytes[i] = savedBytes[i];
}
for(int i = 0; i < count; i++)
{
bytes[i + savedBytes.length] = temp[i];
}
savedBytes = null;
}else if (dataState == OVER) {//上次消息有多余 : 上次多余的 + 本次传入的
bytes = new byte[fromLastBytes.length + count];
for(int i = 0 ; i < fromLastBytes.length; i++)
{
bytes[i] = fromLastBytes[i];
}
for(int i = 0; i < count; i++)
{
bytes[i + fromLastBytes.length] = temp[i];
}
fromLastBytes = null;
}
byte whole_msg_len_bytes[] = new byte[2];
whole_msg_len_bytes[0] = bytes[2];
whole_msg_len_bytes[1] = bytes[3];
short whole_msg_len = StreamTool.byteToShort(whole_msg_len_bytes);// (2) ---> 整条信息长度(3-7)
// System.out.println(" 1 + 2 + 信息 需要的长度(3-7) : "+ (whole_msg_len + 4) );
// System.out.println("经过拼接的信息长度 :