问题说明: 前期在设计socket 通信时,设计的不够完善,在返回的消息中带有消息的长度,但是是和消息一起加密后,返回到前台系统。在实际应用时,如果后台返回的数据包过大,只能接收一部份数据(一般在 4k 左右),后面的数据会产生乱码。
系统说明 :
建立socket 连接后,发送了三次消息:
第一次发送消息进行用户认证,可以读到返回的消息内容;
第二次发送的是要发的消息的长度,不需要读取返回的消息内容;
第三次发送需要的消息请求,后台根据请求返回我们要的消息内容。这时如果设定一个很大空间的字节数组,读取返回数据时,不能保证一次读取完 (虽然后台发了一个包,但在网络传输过程中, os 分配的缓冲区时一定的,这时 os 可能就分成 ) ;采用逐个字节读取时,读不到返回的数据。
解决方式: 先读取后台返回的消息(消息中含有本条消息的长度),解密后取得消息的长度,再根据消息长度判断读取到的消息长度是否是实际的消息长度,如果不相同,则表示是分包传输的,需要读取下一个包中的消息内容,依此类推,将读取到的消息内容放到一起,即为实际传输的消息长度。( 具体实现方式可参见下一代互联网网络审计系统 ) 。
设计注意点: 在socket 通信过程中要设计消息体时要注意: 要么有长度,要么有唯一的结束符,要么是自建或通用的协议有固定的格式去约束,否则分不开不同的包,就挂了。
不知道长度是可以读,但是如果后台发两个包,tcp是会黏在一起的 。