DelimiterBasedFrameDecoder 自定義分隔符
給Server發送多條信息,但是server會講多條信息合並為一條。這時候我們需要對發生的消息指定分割,讓client和server都知道這些消息是一條一條的
//設置連接符/分隔符,換行顯示
ByteBuf buf = Unpooled.copiedBuffer("$_".getBytes());
//DelimiterBasedFrameDecoder:自定義分隔符
sc.pipeline().addLast(new DelimiterBasedFrameDecoder(1024, buf));
//設置為字符串形式的解碼:將傳遞的buf改為String
sc.pipeline().addLast(new StringDecoder());
//處理消息
sc.pipeline().addLast(new ClientHandler());
整體代碼:
public static void main(String[] args) throws InterruptedException {
EventLoopGroup worker = new NioEventLoopGroup();
Bootstrap b = new Bootstrap();
b.group(worker)
.channel(NioSocketChannel.class)
.handler(new ChannelInitializer<SocketChannel>() {
@Override
protected void initChannel(SocketChannel sc) throws Exception {
// TODO Auto-generated method stub
//設置連接符/分隔符,換行顯示
ByteBuf buf = Unpooled.copiedBuffer("$_".getBytes());
//DelimiterBasedFrameDecoder:自定義分隔符
sc.pipeline().addLast(new DelimiterBasedFrameDecoder(1024, buf));
//設置為字符串形式的解碼:將傳遞的buf改為String
sc.pipeline().addLast(new StringDecoder());
sc.pipeline().addLast(new ClientHandler());
}
});
//連接端口
ChannelFuture cf = b.connect("127.0.0.1", 8765).sync();
cf.channel().writeAndFlush(Unpooled.copiedBuffer("aaa$_".getBytes()));
cf.channel().writeAndFlush(Unpooled.copiedBuffer("bbbbb$_".getBytes()));
cf.channel().writeAndFlush(Unpooled.copiedBuffer("cccccccc$_".getBytes()));
cf.channel().closeFuture().sync();
worker.shutdownGracefully();
}
FixedLengthFrameDecoder 定長消息:及發送的消息需要一定的長度,當長度不夠時,剩下的消息將會被丟棄,只能通過補空格來防止被丟棄
//自定義長度,換行顯示 //設置每次發送長度為5個字符 sc.pipeline().addLast(new FixedLengthFrameDecoder(5)); //設置為字符串形式的解碼:將傳遞的buf改為String sc.pipeline().addLast(new StringDecoder()); //處理消息 sc.pipeline().addLast(new ClientHandler());
完整代碼
public static void main(String[] args) throws InterruptedException {
EventLoopGroup worker = new NioEventLoopGroup();
Bootstrap b = new Bootstrap();
b.group(worker)
.channel(NioSocketChannel.class)
.handler(new ChannelInitializer<SocketChannel>() {
@Override
protected void initChannel(SocketChannel sc) throws Exception {
// TODO Auto-generated method stub
//設置定長長度為5個字符,換行顯示
//每次發送消息的長度需要是5的倍數
sc.pipeline().addLast(new FixedLengthFrameDecoder(5));
//設置為字符串形式的解碼:將傳遞的buf改為String
sc.pipeline().addLast(new StringDecoder());
sc.pipeline().addLast(new ClientHandler());
}
});
//連接端口
ChannelFuture cf = b.connect("127.0.0.1", 8765).sync();
//打印為:aaaaa
//打印為:bb被丟棄,未滿5個長度
cf.channel().writeAndFlush(Unpooled.copiedBuffer("aaaaabb".getBytes()));
//打印為:bbbbb
//打印完:ccccc
cf.channel().writeAndFlush(Unpooled.copiedBuffer("bbbbbccccc".getBytes()));
//打印為:ddddd
//打印完:dd空格空格空格
cf.channel().writeAndFlush(Unpooled.copiedBuffer("ddddddd
".getBytes()));
cf.channel().closeFuture().sync();
worker.shutdownGracefully();
}
