Android socket 客户端 C++服务端, 延时严重解决,贴点粘包代码

博主分享了在Android应用中使用Socket通信时遇到的延时严重问题,最初怀疑是IO包效率问题,尝试切换到NIO后发现仍存在延时。经过排查,发现是因为数据缓存未及时处理导致,解决方案是确保每次接收数据后立即处理,避免粘包现象。文中提及使用Google Protobuf协议进行数据交换。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

这个问题曾经困扰姐很久,但因为只是延时,而数据仍然正确,就将这个问题放在一边了。

昨天开始研究,以为是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("经过拼接的信息长度         : 
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值