首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 网站开发 > Web前端 >

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

2012-11-26 
Socket通信过程中,在返回的消息中不能完全读取所有返回消息的问题问题说明:前期在设计socket通信时,设计的

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

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

系统说明:

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

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

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

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

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

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

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

热点排行