成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

Hello Netty

flyer_dev / 411人閱讀

摘要:通過(guò)進(jìn)行網(wǎng)絡(luò)編程,可以提高網(wǎng)絡(luò)通信的開(kāi)發(fā)效率的同時(shí)大大提高網(wǎng)絡(luò)通信的效率。用于初始化,創(chuàng)建為的類型。實(shí)現(xiàn)傳輸對(duì)象的和都依賴于自定義的進(jìn)行定義。到這里一個(gè)簡(jiǎn)單的就實(shí)現(xiàn)完畢了。

通過(guò)java進(jìn)行網(wǎng)絡(luò)編程,netty可以提高網(wǎng)絡(luò)通信的開(kāi)發(fā)效率的同時(shí)大大提高網(wǎng)絡(luò)通信的效率。下面來(lái)看下如何使用netty進(jìn)行高效編程。

引入依賴

    io.nettynetty-all
    4.0.25.Final

netty3和netty4在編程api上有一定的區(qū)別,本篇是通過(guò)netty4進(jìn)行實(shí)踐的。

服務(wù)端句柄對(duì)象io.netty.bootstrap.ServerBootstrap

netty服務(wù)端和客戶端的創(chuàng)建都是依賴于Bootstrap句柄對(duì)象,下面我們看下服務(wù)端是如何通過(guò)ServerBootstrap創(chuàng)建服務(wù)的。

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對(duì)象的屬性:

io.netty.bootstrap.ServerBootstrap#group(io.netty.channel.EventLoopGroup, io.netty.channel.EventLoopGroup)第一個(gè)參數(shù)是用于接收請(qǐng)求的EventLoopGroup,第二個(gè)參數(shù)是處理請(qǐng)求的EventLoopGroup。

io.netty.bootstrap.AbstractBootstrap#channel用于初始化channelFactory,channel創(chuàng)建為NioServerSocketChannel的類型。

io.netty.bootstrap.AbstractBootstrap#localAddress(java.net.SocketAddress)這個(gè)沒(méi)什么好說(shuō)的設(shè)置監(jiān)聽(tīng)的地址。

io.netty.bootstrap.ServerBootstrap#childHandler數(shù)據(jù)流的handler處理器,上面我們?cè)O(shè)置了四個(gè)handler,分別有數(shù)據(jù)流出和流進(jìn)是待處理的handler鏈。

上面都是在初始化句柄接下來(lái),serverBootstrap.bind().sync()同步開(kāi)啟服務(wù)。

客戶端句柄對(duì)象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));

客戶端句柄初始化相對(duì)來(lái)說(shuō)簡(jiǎn)單,初始化處理EventLoopGroup,channel factory,handler處理鏈,最后connect就可以連接到netty的服務(wù)端了。

handler實(shí)現(xiàn)

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));
    }
}

傳輸對(duì)象的encode和decode都依賴于自定義的NettyCommand進(jìn)行定義。

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");
        }
    }

到這里一個(gè)簡(jiǎn)單的hello netty就實(shí)現(xiàn)完畢了。

后記

到這里整個(gè)腦袋還不是太清晰,可能是因?yàn)槌醮问褂胣etty,很多深入的原理性東西還沒(méi)有充分的認(rèn)識(shí)到,后面不斷學(xué)習(xí)升華。

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/66129.html

相關(guān)文章

  • Netty+SpringBoot+FastDFS+Html5實(shí)現(xiàn)聊天App詳解(一)

    摘要:線程切換效率低下單機(jī)核數(shù)固定,線程爆炸之后操作系統(tǒng)頻繁進(jìn)行線程切換,應(yīng)用性能急劇下降。線程切換效率低下由于模型中線程數(shù)量大大降低,線程切換效率因此也大幅度提高。將兩個(gè)線程優(yōu)雅地關(guān)閉。創(chuàng)建管道的子處理器,用于處理。 Netty+SpringBoot+FastDFS+Html5實(shí)現(xiàn)聊天App,項(xiàng)目介紹:https://segmentfault.com/a/11... Netty+Sprin...

    terasum 評(píng)論0 收藏0
  • Netty+SpringBoot+FastDFS+Html5實(shí)現(xiàn)聊天App詳解(一)

    摘要:線程切換效率低下單機(jī)核數(shù)固定,線程爆炸之后操作系統(tǒng)頻繁進(jìn)行線程切換,應(yīng)用性能急劇下降。線程切換效率低下由于模型中線程數(shù)量大大降低,線程切換效率因此也大幅度提高。將兩個(gè)線程優(yōu)雅地關(guān)閉。創(chuàng)建管道的子處理器,用于處理。 Netty+SpringBoot+FastDFS+Html5實(shí)現(xiàn)聊天App,項(xiàng)目介紹:https://segmentfault.com/a/11... Netty+Sprin...

    CNZPH 評(píng)論0 收藏0
  • 淺析微服務(wù)框架 Helidon 的使用

    摘要:零前期準(zhǔn)備版本版本核心依賴包支持包簡(jiǎn)介是官方出品的微服務(wù)框架,底層基于驅(qū)動(dòng),大致的使用套路和相差不是很多筆者只是淺淺的了解過(guò),可能存在理解不透的情況。一配置中的配置類有兩種,一種是用于讀取配置文件的,另一種是用于配置服務(wù)器對(duì)象的。 零 前期準(zhǔn)備 0 版本 JDK 版本 : OpenJDK 11.0.1 IDE : idea 2018.3 Helidon Webserver : heli...

    dockerclub 評(píng)論0 收藏0
  • netty搭建web聊天室(1)

    摘要:提供異步的事件驅(qū)動(dòng)的網(wǎng)絡(luò)應(yīng)用程序框架和工具,用以快速開(kāi)發(fā)高性能高可靠性的網(wǎng)絡(luò)服務(wù)器和客戶端程序。總結(jié)我們完成了服務(wù)端的簡(jiǎn)單搭建,模擬了聊天會(huì)話場(chǎng)景。 之前一直在搞前端的東西,都快忘了自己是個(gè)java開(kāi)發(fā)。其實(shí)還有好多java方面的東西沒(méi)搞過(guò),突然了解到netty,覺(jué)得有必要學(xué)一學(xué)。 介紹 Netty是由JBOSS提供的一個(gè)java開(kāi)源框架。Netty提供異步的、事件驅(qū)動(dòng)的網(wǎng)絡(luò)應(yīng)用程序框...

    izhuhaodev 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<