netty入门例子

netty封装了java的nio。开发只需要按照netty提供的api方法,相对繁琐nio使开发变的相对简单很多。

服务端启动

复制代码
//创建两个线程池
EventLoopGroup bossGroup = new NioEventLoopGroup(1);
EventLoopGroup workerGroup = new NioEventLoopGroup();
//boot启动类
ServerBootstrap boot = new ServerBootstrap();
//绑定线程池,channel类型为NioServerSocketChannel
boot.group(bossGroup,workerGroup).channel(NioServerSocketChannel.class)
        .childHandler(new ChannelInitializer<SocketChannel>() {
            @Override
            protected void initChannel(SocketChannel channel) throws Exception {
               //添加pipeline
                channel.pipeline()
                        .addLast(new StringDecoder())
                        .addLast(new StringEncoder())
                        .addLast(new ChatServerHandler());
            }
        });
System.out.println("server start");
//绑定端口
ChannelFuture future = boot.bind(9000).sync();

ChatServerHandler就是简单继承SimpleChannelInboundHandler,重写channelRead0方法。

复制代码
public class ChatServerHandler extends SimpleChannelInboundHandler<String> {
    @Override
    protected void channelRead0(ChannelHandlerContext ctx, String s) throws Exception {
        System.out.println(s);
    }
}

客户端启动

复制代码
//创建线程组
EventLoopGroup group = new NioEventLoopGroup();
//启动类
Bootstrap boot = new Bootstrap();
//绑定线程组,设置channel类型为NioSocketChannel
boot.group(group).channel(NioSocketChannel.class)
        .handler(new ChannelInitializer<SocketChannel>() {
            @Override
            protected void initChannel(SocketChannel channel) throws Exception {
                //初始化pipeline
                channel.pipeline()
                        .addLast(new StringEncoder())
                        .addLast(new StringDecoder());
            }
        });
        //连接server
ChannelFuture future = boot.connect("localhost", 9000).sync();
Channel channel = future.channel();
//发送数据
channel.writeAndFlush("hi");
channel.closeFuture().sync();
group.shutdownGracefully();

服务端能收到客户端发送数据。

线程模型

使用reactor线程模型处理channel事件。

线程组:

线程组的创建通过NioEventLoopGroup类,可以入参指定线程组内child数量,不指定会根据当前机器的CPU进行计算child数量。每个child是一个NioEventLoop实例。NioEventLoop是一个单线程线程池类。

线程组内监听到Selector事件都会交由channel绑定的pipeline进行处理。

BossGroup:负责创建serverchannel,并且处理client连接事件,也就是accept事件。然后将新建的client连接与workGroup线程池进行绑定

workGroup:负责监听已绑定channel连接的读写事件。

参考:

https://www.alibabacloud.com/blog/essential-technologies-for-java-developers-io-and-netty_597367

相关推荐
Luo_xguan19 小时前
一、Netty-高并发IO底层原理(5种主要的IO模型)
java·服务器·netty·nio
戮戮9 天前
一次深入排查:Spring Cloud Gateway TCP 连接复用导致 K8s 负载均衡失效
tcp/ip·spring cloud·kubernetes·gateway·负载均衡·netty
fat house cat_9 天前
【netty】基于主从Reactor多线程模型|如何解决粘包拆包问题|零拷贝
java·服务器·网络·netty
Moe48812 天前
Netty技术:SimpleChannelInboundHandler<>的使用
netty
poemyang15 天前
jemalloc思想的极致演绎:深度解构Netty内存池的精妙设计与实现
rpc·netty
poemyang16 天前
“化零为整”的智慧:内存池如何绕过系统调用和GC,构建性能的护城河
rpc·netty
晓牛开发者17 天前
Netty4 TLS单向安全加密传输案例
netty
hanxiaozhang201819 天前
Netty面试重点-2
面试·netty
9527出列20 天前
Netty源码分析--客户端连接接入流程解析
网络协议·netty
马尚来21 天前
【韩顺平】尚硅谷Netty视频教程
后端·netty