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

相关推荐
你熬夜了吗?5 天前
spring中使用netty-socketio部署到服务器(SSL、nginx转发)
服务器·websocket·spring·netty·ssl
异常君5 天前
Netty Reactor 线程模型详解:构建高性能网络应用的关键
java·后端·netty
次元5 天前
初识Netty的奇经八脉
netty
南客先生5 天前
马架构的Netty、MQTT、CoAP面试之旅
java·mqtt·面试·netty·coap
异常君8 天前
一文吃透 Netty 处理粘包拆包的核心原理与实践
java·后端·netty
猫吻鱼9 天前
【Netty4核心原理】【全系列文章目录】
netty
用户905558421480510 天前
AdaptiveRecvByteBuAllocator 源码分析
netty
菜菜的后端私房菜11 天前
深入剖析 Netty 中的 NioEventLoopGroup:架构与实现
java·后端·netty
码熔burning14 天前
【Netty篇】Channel 详解
netty·nio·channel
Pitayafruit21 天前
📌 Java 工程师进阶必备:Spring Boot 3 + Netty 构建高并发即时通讯服务
spring boot·后端·netty