netty粘包问题3
/**
* tcp/ip协议都会有黏包,半包这个问题,UDP没有这个问题
*/
@Slf4j
public class HelloWorldClient {
public static void main(String[] args) throws InterruptedException {
NioEventLoopGroup worker = new NioEventLoopGroup();
try {
Bootstrap bootstrap = new Bootstrap();
bootstrap.channel(NioSocketChannel.class);
bootstrap.group(worker);
bootstrap.handler(new ChannelInitializer<SocketChannel>() {
@Override
protected void initChannel(SocketChannel ch) {
// ch.pipeline().addLast(new LoggingHandler(LogLevel.DEBUG));
ch.pipeline().addLast(new ChannelInboundHandlerAdapter() {
@Override
public void channelActive(ChannelHandlerContext ctx) throws Exception {
//每次发16字节,发十次共160字节
for (int i = 0; i < 10; i++) {
ByteBuf buffer = ctx.alloc().buffer(16);
buffer.writeBytes(new byte[]{0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15});
ctx.writeAndFlush(buffer);
}
}
});
}
});
ChannelFuture localhost = bootstrap.connect("localhost", 9090).sync();
localhost.channel().closeFuture().sync();
} catch (InterruptedException e) {
log.debug("server error", e);
} finally {
worker.shutdownGracefully();
}
}
}
服务端
package com.io.netty.netty.netty10;
import io.netty.bootstrap.ServerBootstrap;
import io.netty.channel.*;
import io.netty.channel.nio.NioEventLoopGroup;
import io.netty.channel.socket.SocketChannel;
import io.netty.channel.socket.nio.NioServerSocketChannel;
import io.netty.handler.logging.LogLevel;
import io.netty.handler.logging.LoggingHandler;
import lombok.extern.slf4j.Slf4j;
@Slf4j
public class HelloWorldServer {
public static void main(String[] args) throws InterruptedException {
NioEventLoopGroup boss = new NioEventLoopGroup();
NioEventLoopGroup worker = new NioEventLoopGroup();
try {
ServerBootstrap serverBootstrap = new ServerBootstrap();
serverBootstrap.group(boss,worker);
serverBootstrap.channel(NioServerSocketChannel.class);
//这行代码用于设置 ServerSocketChannel 的接收缓冲区大小
serverBootstrap.option(ChannelOption.SO_RCVBUF, 10);
serverBootstrap.childHandler(new ChannelInitializer<SocketChannel>() {
@Override
protected void initChannel(SocketChannel ch) {
ch.pipeline().addLast(new LoggingHandler(LogLevel.DEBUG));
ch.pipeline().addLast(new ChannelInboundHandlerAdapter() {
@Override
public void channelActive(ChannelHandlerContext ctx) throws Exception {
log.debug("connected{}", ctx.channel());
super.channelActive(ctx);
}
});
}
});
ChannelFuture channelFuture = serverBootstrap.bind(9090).sync();
channelFuture.channel().closeFuture().sync();
} catch (InterruptedException e) {
log.debug("server error", e);
} finally {
boss.shutdownGracefully();
worker.shutdownGracefully();
}
}
}
比如:发短信,图片这种数据不会丢失,要是就打电话,视频出现卡顿,模糊就会允许部分数据丢失(UDP协议)
具体做法可以服务端,客户端使用约定固定数据长度,使用长度解码器,或者规定长度解码器来约定。
本文来自博客园,作者:余生请多指教ANT,转载请注明原文链接:https://www.cnblogs.com/wangbiaohistory/p/18704609

浙公网安备 33010602011771号