
课程咨询: 400-996-5531 / 投诉建议: 400-111-8989
认真做教育 专心促就业
随着互联网的不断发展,越来越多的人都在学习达内java编程开发等互联网课程,而本文我们就通过案例分析来简单了解一下,软件开发网络协议设计方法。
概要划分
一个基本的网络协议必须包含
数据的长度
数据
了解TCP协议的同学一定听说过粘包、拆包这两个术语。因为TCP协议是数据流协议,它的底层根据二进制缓冲区的实际情况进行包的划分。所以,不可避免的会出现粘包,拆包现象。为了解决它们,我们的网络协议往往会使用一个4字节的int类型来表示数据的大小。比如,Netty就为我们提供了LengthFieldBasedFrameDecoder解码器,它可以有效的使用自定义长度帧来解决上述问题。
同时一个好的网络协议,还会将动作和业务数据分离。试想一下,HTTP协议的分为请求头,请求体——
请求头:定义了接口地址、HttpMethod、HTTP版本
请求体:定义了需要传递的数据
这就是一种分离关注点的思想。所以自定义的网络协议也可以包含:
动作指令:比如定义code来分门别类的代表不同的业务逻辑
序列化算法:描述了JAVA对象和二进制之间转换的形式,提供多种序列化/反序列化方式。比如json、protobuf等等,甚至是自定义算法。比如:rocketmq等等。
同时,协议的开头可以定义一个约定的魔数。这个固定值(4字节),一般用来判断当前的数据包是否合法。比如,当我们使用telnet发送错误的数据包时,很显然,它不合法,会导致解码失败。所以,为了减轻服务器的压力,我们可以取出数据包的前4个字节与固定的魔数对比,如果是非法的格式,直接关闭连接,不继续解码。
RocketMQ网络协议
这一小节,我们从RocketMQ中,分析优秀通信网络协议的实现。RocketMQ项目中,客户端和服务端的通信是基于Netty之上构建的。同时,为了更加有效的通信,往往需要对发送的消息自定义网络协议。
RocketMQ的网络协议,从数据分类的角度上看,可分为两大类
消息头数据(HeaderData)
消息体数据(BodyData)
【免责声明】:本内容转载于网络,转载目的在于传递信息。文章内容为作者个人意见,本平台对文中陈述、观点保持中立,不对所包含内容的准确性、可靠性与完整性提供形式地保证。请读者仅作参考。更多内容请加抖音太原达内IT培训学习了解。