Netty
自定义消息协议的实现逻辑
消息协议:这一次消息需要包含两个部分,即消息长度和消息内容本身。
自定义消息编码器︰消息编码器将客户端发送的消息转换成遵守消息协议的消息,即包含消息长度和消息内容的消息
自定义消息解码器∶消息解码器根据消息协议的消息长度,来获得指定长度的消息内容。
自定义编码器
自定义消息协议:
//自定义消息协议
public class MessageProtocal {
//消息的长度
private int length;
//消息的内容
private byte[] content;
public int getLength() {
return length;
}
public void setLength(int length) {
this.length = length;
}
public byte[] getContent() {
return content;
}
public void setContent(byte[] content) {
this.content = content;
}
}
客户端基本代码
public class NettyClient {
public static void main(String[] args) throws Exception {
EventLoopGroup group = new NioEventLoopGroup(1);
Bootstrap bootstrap = new Bootstrap();
//设置相关的参数
bootstrap.group(group)
.channel(NioSocketChannel.class)
.handler(new ChannelInitializer<SocketChannel>() {
@Override
protected void initChannel(SocketChannel ch) throws Exception {
ChannelPipeline pipeline = ch.pipeline();
//添加处理器,分包编码器
pipeline.addLast(new MessageEncoder());
//添加具体的业务处理器
pipeline.addLast(new NettyMessageClientHandler());
}
});
System.out.println("客户端启动了");
ChannelFuture channelFuture = bootstrap.connect("127.0.0.1", 9090).sync();
channelFuture.channel().closeFuture().sync();
group.shutdownGracefully();
}
}
客户端业务代码
public class NettyMessageClientHandler extends SimpleChannelInboundHandler<MessageProtocal> {
//连接通道创建后要向服务端发送消息
@Override
public void channelActive(ChannelHandlerContext ctx) throws Exception {
for(int i=0;i<200;i++){
String msg = "西安科技大学";
//创建消息协议对象
MessageProtocal messageProtocal =