Socket通信过程中,在返回的消息中不能完全读取所有返回消息的问题

问题说明: 前期在设计socket 通信时,设计的不够完善,在返回的消息中带有消息的长度,但是是和消息一起加密后,返回到前台系统。在实际应用时,如果后台返回的数据包过大,只能接收一部份数据(一般在 4k 左右),后面的数据会产生乱码。

系统说明

建立socket 连接后,发送了三次消息:

第一次发送消息进行用户认证,可以读到返回的消息内容;

第二次发送的是要发的消息的长度,不需要读取返回的消息内容;

第三次发送需要的消息请求,后台根据请求返回我们要的消息内容。这时如果设定一个很大空间的字节数组,读取返回数据时,不能保证一次读取完 (虽然后台发了一个包,但在网络传输过程中, os 分配的缓冲区时一定的,这时 os 可能就分成 ) ;采用逐个字节读取时,读不到返回的数据。

解决方式: 先读取后台返回的消息(消息中含有本条消息的长度),解密后取得消息的长度,再根据消息长度判断读取到的消息长度是否是实际的消息长度,如果不相同,则表示是分包传输的,需要读取下一个包中的消息内容,依此类推,将读取到的消息内容放到一起,即为实际传输的消息长度。( 具体实现方式可参见下一代互联网网络审计系统 )

设计注意点: socket 通信过程中要设计消息体时要注意: 要么有长度,要么有唯一的结束符,要么是自建或通用的协议有固定的格式去约束,否则分不开不同的包,就挂了。

不知道长度是可以读,但是如果后台发两个包,tcp是会黏在一起的

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值