国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

Hello Netty

flyer_dev / 398人閱讀

摘要:通過進行網絡編程,可以提高網絡通信的開發效率的同時大大提高網絡通信的效率。用于初始化,創建為的類型。實現傳輸對象的和都依賴于自定義的進行定義。到這里一個簡單的就實現完畢了。

通過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,很多深入的原理性東西還沒有充分的認識到,后面不斷學習升華。

文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。

轉載請注明本文地址:http://specialneedsforspecialkids.com/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元查看
<