资讯专栏INFORMATION COLUMN

Hello Netty

flyer_dev / 302人阅读

摘要:通过进行网络编程,可以提高网络通信的开发效率的同时大大提高网络通信的效率。用于初始化,创建为的类型。实现传输对象的和都依赖于自定义的进行定义。到这里一个简单的就实现完毕了。

通过java进行网络编程,netty可以提高网络通信的开发效率的同时大大提高网络通信的效率。下面来看下如何使用netty进行高效编程。

引入依赖

    io.nettynetty-all
    4.0.25.Final

netty3和netty4在编程api上有一定的区别,本篇是通过netty4进行实践的。

服务端句柄对象io.netty.bootstrap.ServerBootstrap

netty服务端和客户端的创建都是依赖于Bootstrap句柄对象,下面我们看下服务端是如何通过ServerBootstrap创建服务的。

serverBootstrap.group(new NioEventLoopGroup(), new NioEventLoopGroup()).channel(NioServerSocketChannel.class)
    .localAddress(new InetSocketAddress(nettyServerConfig.getListenPort()))
    .childHandler(new ChannelInitializer() {
        @Override
        public void initChannel(SocketChannel ch) throws Exception {
            ch.pipeline().addLast(
                    new NettyEncoder(),
                    new NettyDecoder(),
                    new NettyConnetManageHandler(),
                    new EchoServerHandler());
        }
    });

ChannelFuture f = serverBootstrap.bind().sync();

大家去看源码就可以知道上面都是在初始化ServerBootstrap对象的属性:

io.netty.bootstrap.ServerBootstrap#group(io.netty.channel.EventLoopGroup, io.netty.channel.EventLoopGroup)第一个参数是用于接收请求的EventLoopGroup,第二个参数是处理请求的EventLoopGroup。

io.netty.bootstrap.AbstractBootstrap#channel用于初始化channelFactory,channel创建为NioServerSocketChannel的类型。

io.netty.bootstrap.AbstractBootstrap#localAddress(java.net.SocketAddress)这个没什么好说的设置监听的地址。

io.netty.bootstrap.ServerBootstrap#childHandler数据流的handler处理器,上面我们设置了四个handler,分别有数据流出和流进是待处理的handler链。

上面都是在初始化句柄接下来,serverBootstrap.bind().sync()同步开启服务。

客户端句柄对象io.netty.bootstrap.Bootstrap
bootstrap.group(new NioEventLoopGroup()).channel(NioSocketChannel.class)
    .handler(new ChannelInitializer() {
        @Override
        public void initChannel(SocketChannel ch) throws Exception {
            ch.pipeline().addLast(
                    new NettyEncoder(),
                    new NettyDecoder(),
                    new NettyClientHandler());
        }
    });

bootstrap.connect(new InetSocketAddress(ip, port));

客户端句柄初始化相对来说简单,初始化处理EventLoopGroup,channel factory,handler处理链,最后connect就可以连接到netty的服务端了。

handler实现

1、NettyEncoder

public class NettyEncoder extends MessageToByteEncoder {

    @Override
    public void encode(ChannelHandlerContext ctx, NettyCommand msg, ByteBuf out)
            throws Exception {

        out.writeBytes(msg.encode());
    }
}

2、NettyDecoder

public class NettyDecoder extends ByteToMessageDecoder {

    @Override
    protected void decode(ChannelHandlerContext ctx, ByteBuf in, List out) throws Exception {
        byte[] tmpBuf = new byte[in.readableBytes()];
        in.readBytes(tmpBuf);
        NettyCommand command = new NettyCommand();
        out.add(command.decode(tmpBuf));
    }
}

传输对象的encode和decode都依赖于自定义的NettyCommand进行定义。

3、EchoServerHandler

class EchoServerHandler extends ChannelInboundHandlerAdapter {

        @Override
        public void channelReadComplete(ChannelHandlerContext ctx) throws Exception {
            System.out.println("phase: channelReadComplete");
        }

        @Override
        public void exceptionCaught(ChannelHandlerContext ctx,
                                    Throwable cause) {
            System.out.println("phase: exceptionCaught");
            cause.printStackTrace();
            ctx.close();
        }

        @Override
        public void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception {
            NettyCommand requestCommand = (NettyCommand) msg;
            System.out.println("Server received: " + new String(requestCommand.getBody()));

            processMessageReceive(ctx, requestCommand);
        }

    }

4、NettyClientHandler

class NettyClientHandler extends SimpleChannelInboundHandler {

        @Override
        public void channelActive(ChannelHandlerContext ctx) {
            System.out.println("channelActive");
        }

        @Override
        protected void channelRead0(ChannelHandlerContext ctx, NettyCommand msg)
                throws Exception {
            NettyCommand command = (NettyCommand) msg;
            processMessageReceive(ctx, command);
        }

        @Override
        public void exceptionCaught(ChannelHandlerContext ctx,
                                    Throwable cause) {                    //4
            System.out.println("exceptionCaught");
            cause.printStackTrace();
            ctx.close();
        }

        @Override
        public void channelReadComplete(ChannelHandlerContext ctx) throws Exception {
            System.out.println("channelReadComplete");
        }
    }

到这里一个简单的hello netty就实现完毕了。

后记

到这里整个脑袋还不是太清晰,可能是因为初次使用netty,很多深入的原理性东西还没有充分的认识到,后面不断学习升华。

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/66129.html

相关文章

  • Netty+SpringBoot+FastDFS+Html5实现聊天App详解(一)

    摘要:线程切换效率低下单机核数固定,线程爆炸之后操作系统频繁进行线程切换,应用性能急剧下降。线程切换效率低下由于模型中线程数量大大降低,线程切换效率因此也大幅度提高。将两个线程优雅地关闭。创建管道的子处理器,用于处理。 Netty+SpringBoot+FastDFS+Html5实现聊天App,项目介绍:https://segmentfault.com/a/11... Netty+Sprin...

    terasum 评论0 收藏0
  • Netty+SpringBoot+FastDFS+Html5实现聊天App详解(一)

    摘要:线程切换效率低下单机核数固定,线程爆炸之后操作系统频繁进行线程切换,应用性能急剧下降。线程切换效率低下由于模型中线程数量大大降低,线程切换效率因此也大幅度提高。将两个线程优雅地关闭。创建管道的子处理器,用于处理。 Netty+SpringBoot+FastDFS+Html5实现聊天App,项目介绍:https://segmentfault.com/a/11... Netty+Sprin...

    CNZPH 评论0 收藏0
  • 浅析微服务框架 Helidon 的使用

    摘要:零前期准备版本版本核心依赖包支持包简介是官方出品的微服务框架,底层基于驱动,大致的使用套路和相差不是很多笔者只是浅浅的了解过,可能存在理解不透的情况。一配置中的配置类有两种,一种是用于读取配置文件的,另一种是用于配置服务器对象的。 零 前期准备 0 版本 JDK 版本 : OpenJDK 11.0.1 IDE : idea 2018.3 Helidon Webserver : heli...

    dockerclub 评论0 收藏0
  • netty搭建web聊天室(1)

    摘要:提供异步的事件驱动的网络应用程序框架和工具,用以快速开发高性能高可靠性的网络服务器和客户端程序。总结我们完成了服务端的简单搭建,模拟了聊天会话场景。 之前一直在搞前端的东西,都快忘了自己是个java开发。其实还有好多java方面的东西没搞过,突然了解到netty,觉得有必要学一学。 介绍 Netty是由JBOSS提供的一个java开源框架。Netty提供异步的、事件驱动的网络应用程序框...

    izhuhaodev 评论0 收藏0

发表评论

0条评论

flyer_dev

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<