Netty自定义通信协议主要是在解码器与编码器,其他的变动不大。netty入门实例:https://blog.youkuaiyun.com/zc_ad/article/details/83824911,此处将测试的demo共享出来,现在对netty没办法到用语言组织的程度,只能先将demo贡献出来,到时候学的更加深入了,会将添加上讲解。
此demo的形成的效果是:当客户端连接服务端时,会向服务端发送自定义协议消息,服务端收到客户端自定义协议消息后,会给客户端发送另一条自定义协议消息。
协议格式:
* 数据包格式
+——----——+——-----——+——----——+
|协议开始标志| 长度 | 数据 |
+——----——+——-----——+——----——+
1.协议开始标志head_data,为int类型的数据,16进制表示为0X76
2.传输数据的长度contentLength,int类型
3.要传输的数据
固定值,报头:
/**
* Created by XiChuan on 2018-11-07.
*/
public class Constant {
public static final int HEAD = 0x76;
}
自定义协议:
/**
* Created by XiChuan on 2018-11-07.
*/
import java.util.Arrays;
/**
* <pre>
* 自己定义的协议
* 数据包格式
* +——----——+——-----——+——----——+
* |协议开始标志| 长度 | 数据 |
* +——----——+——-----——+——----——+
* 1.协议开始标志head_data,为int类型的数据,16进制表示为0X76
* 2.传输数据的长度contentLength,int类型
* 3.要传输的数据
* </pre>
*/
public class MessageProtocol {
/**
* 消息的开头的信息标志
*/
private int head_data = Constant.HEAD;
/**
* 消息的长度
*/
private int contentLength;
/**
* 消息的内容
*/
private byte[] content;
/**
* 用于初始化,SmartCarProtocol
*
* @param contentLength
* 协议里面,消息数据的长度
* @param content
* 协议里面,消息的数据
*/
public MessageProtocol(int contentLength, byte[] content) {
this.contentLength = contentLength;
this.content = content;
}
public int getHead_data() {
return head_data;
}
public int getContentLength() {
return contentLength;
}
public void setContentLength(int contentLength) {
this.contentLength = contentLength;
}
public byte[] getContent() {
return content;
}
public void setContent(byte[] content) {
this.content = content;
}
@Override
public String toString() {
return "MessageProtocol [head_data=" + head_data + ", contentLength="
+ contentLength + ", content=" + Arrays.toString(content) + "]";
}
}
自定义编码器:
import ch.qos.logback.core.encoder.ByteArrayUtil;
import io.netty.buffer.ByteBuf;
import io.netty.buffer.ByteBufUtil;
import io.netty.channel.ChannelHandlerContext;
import io.netty.handler.codec.MessageToByteEncoder;
/**
* Created by XiChuan on 2018-11-07.
*/
/**
* <pre>
* 自己定义的协议
* 数据包格式
* +——----——+——-----——+——----——+
* |协议开始标志| 长度 | 数据 |
* +——----——+——-----——+——----——+
* 1.协议开始标志head_data,为int类型的数据,16进制表示为0X76
* 2.传输数据的长度contentLength,int类型
* 3.要传输的数据
* </pre>
*/
public class MessageProtocolEncoder extends MessageToByteEncoder<MessageProtocol> {
@Override
protected void encode(ChannelHandlerContext channelHandlerContext, MessageProtocol msg, ByteBuf byteBuf) throws Exception {
// 写入消息SmartCar的具体内容
// 1.写入消息的开头的信息标志(int类型)
byteBuf.writeInt(msg.getHead_data());