读书人

Socket通信过程中在返回的消息中不能

发布时间: 2012-11-26 11:48:49 作者: rapoo

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

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

系统说明:

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

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

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

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

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

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

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

读书人网 >Web前端

热点推荐