国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

Netty和傳統(tǒng)NIO之間的比較

這篇具有很好參考價(jià)值的文章主要介紹了Netty和傳統(tǒng)NIO之間的比較。希望對(duì)大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請(qǐng)大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問。

  1. Netty回顯服務(wù)器實(shí)現(xiàn):
import io.netty.bootstrap.ServerBootstrap;
import io.netty.channel.ChannelHandlerContext;
import io.netty.channel.ChannelInitializer;
import io.netty.channel.ChannelOption;
import io.netty.channel.SimpleChannelInboundHandler;
import io.netty.channel.nio.NioEventLoopGroup;
import io.netty.channel.socket.SocketChannel;
import io.netty.channel.socket.nio.NioServerSocketChannel;

public class NettyEchoServer {

    public static void main(String[] args) throws InterruptedException {
        NioEventLoopGroup bossGroup = new NioEventLoopGroup(1);
        NioEventLoopGroup workerGroup = new NioEventLoopGroup();

        try {
            ServerBootstrap serverBootstrap = new ServerBootstrap();
            serverBootstrap.group(bossGroup, workerGroup)
                    .channel(NioServerSocketChannel.class)
                    .childHandler(new ChannelInitializer<SocketChannel>() {
                        @Override
                        protected void initChannel(SocketChannel ch) {
                            ch.pipeline().addLast(new EchoServerHandler());
                        }
                    })
                    .option(ChannelOption.SO_BACKLOG, 128)
                    .childOption(ChannelOption.SO_KEEPALIVE, true);

            serverBootstrap.bind(8080).sync().channel().closeFuture().sync();
        } finally {
            bossGroup.shutdownGracefully();
            workerGroup.shutdownGracefully();
        }
    }

    private static class EchoServerHandler extends SimpleChannelInboundHandler<String> {
        @Override
        protected void channelRead0(ChannelHandlerContext ctx, String msg) {
            System.out.println("Received message: " + msg);
            ctx.writeAndFlush(msg);
        }
    }
}

上述代碼是一個(gè)使用Netty實(shí)現(xiàn)的回顯服務(wù)器。讓我們逐行解釋代碼的實(shí)現(xiàn):

  • 首先,我們創(chuàng)建了兩個(gè)NioEventLoopGroup,一個(gè)用于接收客戶端連接(bossGroup),另一個(gè)用于處理客戶端連接上的請(qǐng)求(workerGroup)。
  • 然后,我們創(chuàng)建一個(gè)ServerBootstrap實(shí)例,并配置各種參數(shù),如所使用的通道類型、事件處理器等。
  • childHandler()方法中,我們初始化處理器鏈,這里只有一個(gè)EchoServerHandler處理器。
  • EchoServerHandler是一個(gè)繼承自SimpleChannelInboundHandler的處理器,它處理接收到的消息并將其回顯給客戶端。
  • 接下來,我們綁定服務(wù)器端口并啟動(dòng)服務(wù)器。
  • 最后,我們關(guān)閉并釋放資源。
  1. 傳統(tǒng)NIO回顯服務(wù)器實(shí)現(xiàn):
import java.io.IOException;
import java.net.InetSocketAddress;
import java.nio.ByteBuffer;
import java.nio.channels.SelectionKey;
import java.nio.channels.Selector;
import java.nio.channels.ServerSocketChannel;
import java.nio.channels.SocketChannel;
import java.util.Iterator;
import java.util.Set;

public class TraditionalNioEchoServer {

    public static void main(String[] args) throws IOException {
        ServerSocketChannel serverSocketChannel = ServerSocketChannel.open();
        serverSocketChannel.socket().bind(new InetSocketAddress(8080));
        serverSocketChannel.configureBlocking(false);

        Selector selector = Selector.open();
        serverSocketChannel.register(selector, SelectionKey.OP_ACCEPT);

        while (true) {
            selector.select();
            Set<SelectionKey> selectedKeys = selector.selectedKeys();
            Iterator<SelectionKey> iterator = selectedKeys.iterator();

            while (iterator.hasNext()) {
                SelectionKey key = iterator.next();
                iterator.remove();

                if (key.isAcceptable()) {
                    ServerSocketChannel serverChannel = (ServerSocketChannel) key.channel();
                    SocketChannel socketChannel = serverChannel.accept();
                    socketChannel.configureBlocking(false);
                    socketChannel.register(selector, SelectionKey.OP_READ);
                } else if (key.isReadable()) {
                    SocketChannel socketChannel = (SocketChannel) key.channel();
                    ByteBuffer buffer = ByteBuffer.allocate(1024);
                    int bytesRead = socketChannel.read(buffer);
                    if (bytesRead == -1) {
                        socketChannel.close();
                        continue;
                    }
                    buffer.flip();
                    String message = new String(buffer.array(), 0, bytesRead);
                    System.out.println("Received message: " + message);

                    socketChannel.write(buffer);
                    key.interestOps(SelectionKey.OP_READ);
                }
            }
        }
    }
}

上述代碼是一個(gè)使用傳統(tǒng)NIO實(shí)現(xiàn)的回顯服務(wù)器。讓我們逐行解釋代碼的實(shí)現(xiàn):

  • 首先,我們創(chuàng)建一個(gè)ServerSocketChannel實(shí)例,并將其綁定到指定的端口上。
  • 然后,我們配置ServerSocketChannel為非阻塞模式,并創(chuàng)建一個(gè)Selector實(shí)例。
  • Selector上注冊(cè)ServerSocketChannel,并將其設(shè)置為接受連接的操作。
  • 進(jìn)入主循環(huán),調(diào)用selector.select()等待就緒的事件。
  • 一旦有事件就緒,我們獲取就緒的SelectionKey集合,并遍歷處理每個(gè)就緒的SelectionKey
  • 如果SelectionKey是可接受的,我們接受客戶端連接,并將客戶端SocketChannel注冊(cè)到Selector上,并設(shè)置為可讀操作。
  • 如果SelectionKey是可讀的,我們讀取客戶端發(fā)送的數(shù)據(jù),并將其回顯給客戶端。
  • 最后,我們繼續(xù)循環(huán)處理就緒的事件。

- 其他特性

當(dāng)涉及到Netty的高級(jí)抽象和擴(kuò)展性時(shí),它們?nèi)绾螏椭_發(fā)網(wǎng)絡(luò)應(yīng)用程序主要體現(xiàn)在以下幾個(gè)方面:

  1. 高級(jí)抽象:Netty提供了一組高級(jí)抽象,如ChannelHandler、ChannelPipelineByteBuf等,它們封裝了底層的網(wǎng)絡(luò)操作和數(shù)據(jù)處理,簡(jiǎn)化了開發(fā)過程。這些高級(jí)抽象使開發(fā)人員能夠?qū)W⒂跇I(yè)務(wù)邏輯而不必過多關(guān)注網(wǎng)絡(luò)操作的細(xì)節(jié)。例如,通過使用ChannelHandlerChannelPipeline,開發(fā)人員可以輕松地定義事件處理器鏈,處理不同類型的事件,以及對(duì)數(shù)據(jù)進(jìn)行編解碼等操作。這種高級(jí)抽象使得編寫網(wǎng)絡(luò)應(yīng)用程序變得更加簡(jiǎn)潔和可讀。

下面是一個(gè)使用Netty高級(jí)抽象的簡(jiǎn)單示例,它演示了一個(gè)回顯服務(wù)器:

import io.netty.bootstrap.ServerBootstrap;
import io.netty.channel.ChannelHandlerContext;
import io.netty.channel.ChannelInitializer;
import io.netty.channel.ChannelOption;
import io.netty.channel.SimpleChannelInboundHandler;
import io.netty.channel.nio.NioEventLoopGroup;
import io.netty.channel.socket.SocketChannel;
import io.netty.channel.socket.nio.NioServerSocketChannel;

public class NettyEchoServer {

    public static void main(String[] args) throws InterruptedException {
        NioEventLoopGroup bossGroup = new NioEventLoopGroup(1);
        NioEventLoopGroup workerGroup = new NioEventLoopGroup();

        try {
            ServerBootstrap serverBootstrap = new ServerBootstrap();
            serverBootstrap.group(bossGroup, workerGroup)
                    .channel(NioServerSocketChannel.class)
                    .childHandler(new ChannelInitializer<SocketChannel>() {
                        @Override
                        protected void initChannel(SocketChannel ch) {
                            ch.pipeline().addLast(new EchoServerHandler());
                        }
                    })
                    .option(ChannelOption.SO_BACKLOG, 128)
                    .childOption(ChannelOption.SO_KEEPALIVE, true);

            serverBootstrap.bind(8080).sync().channel().closeFuture().sync();
        } finally {
            bossGroup.shutdownGracefully();
            workerGroup.shutdownGracefully();
        }
    }

    private static class EchoServerHandler extends SimpleChannelInboundHandler<String> {
        @Override
        protected void channelRead0(ChannelHandlerContext ctx, String msg) {
            System.out.println("Received message: " + msg);
            ctx.writeAndFlush(msg);
        }
    }
}

在上述代碼中,我們使用了Netty的高級(jí)抽象和組件:

  • ServerBootstrap:它是Netty啟動(dòng)服務(wù)器的入口,它封裝了服務(wù)器的配置和啟動(dòng)過程。
  • ChannelInitializer:它是用于初始化新的連接的Channel的處理器。我們可以在其中添加我們自定義的處理器。
  • ChannelOption:它是用于配置ServerBootstrap的選項(xiàng),例如設(shè)置TCP的參數(shù)。
  • SimpleChannelInboundHandler:它是一個(gè)抽象類,提供了一些方便的方法來處理不同類型的事件,比如channelRead0()方法用于處理接收到的消息。

通過使用這些高級(jí)抽象,我們可以輕松地定義和配置服務(wù)器,并實(shí)現(xiàn)業(yè)務(wù)邏輯的處理。

  1. 擴(kuò)展性:Netty具有良好的可擴(kuò)展性,允許開發(fā)人員自定義和添加自己的處理器和組件。Netty的設(shè)計(jì)使得添加新的功能或修改現(xiàn)有功能變得相對(duì)簡(jiǎn)單。

以下是一個(gè)示例,展示了如何自定義一個(gè)處理器來處理特定的業(yè)務(wù)需求:

import io.netty.channel.ChannelHandlerContext;
import io.netty.channel.SimpleChannelInboundHandler;

public class CustomHandler extends SimpleChannelInboundHandler<String> {

    @Override
    protected void channelRead0(ChannelHandlerContext ctx, String msg) {
        // 自定義業(yè)務(wù)邏輯處理
        // ...
    }

    @Override
    public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) {
        // 異常處理
        // ...
    }
}

在上述代碼中,我們創(chuàng)建了一個(gè)自定義處理器CustomHandler,繼承自SimpleChannelInboundHandler。通過重寫channelRead0()方法,我們可以自定義處理接收到的消息的邏輯。通過使用Netty的高級(jí)抽象和擴(kuò)展性,開發(fā)人員可以更輕松地構(gòu)建和擴(kuò)展網(wǎng)絡(luò)應(yīng)用程序。高級(jí)抽象簡(jiǎn)化了網(wǎng)絡(luò)操作和數(shù)據(jù)處理的編程模型,使開發(fā)人員能夠?qū)W⒂跇I(yè)務(wù)邏輯而不必處理底層細(xì)節(jié)。同時(shí),Netty的擴(kuò)展性允許開發(fā)人員根據(jù)自己的需求添加自定義的處理器和組件,以實(shí)現(xiàn)特定的功能和邏輯。這種靈活性使得Netty成為一個(gè)強(qiáng)大且受歡迎的框架,用于構(gòu)建高性能的網(wǎng)絡(luò)應(yīng)用程序。


還有一些方面需要考慮:

  1. 異步和事件驅(qū)動(dòng):Netty是基于事件驅(qū)動(dòng)和異步的I/O模型。它使用了NIO(Non-blocking I/O)機(jī)制,使得應(yīng)用程序能夠處理大量的并發(fā)連接而不會(huì)阻塞。Netty將I/O操作轉(zhuǎn)化為事件,并通過回調(diào)機(jī)制通知應(yīng)用程序處理這些事件。這種異步和事件驅(qū)動(dòng)的特性使得Netty非常適合構(gòu)建高性能、可擴(kuò)展的網(wǎng)絡(luò)應(yīng)用程序,能夠處理大量的并發(fā)連接和高負(fù)載。

  2. 高性能和可伸縮性:Netty通過優(yōu)化底層網(wǎng)絡(luò)操作和數(shù)據(jù)處理,提供了高性能和可伸縮性。它使用了一些技術(shù),如零拷貝(zero-copy)和內(nèi)存池(memory pooling),以減少數(shù)據(jù)復(fù)制和內(nèi)存分配的開銷。Netty還使用了多線程和線程池來處理并發(fā)連接和請(qǐng)求,并通過事件循環(huán)(Event Loop)機(jī)制來實(shí)現(xiàn)高效的事件處理。這些優(yōu)化措施使得Netty能夠處理大規(guī)模的并發(fā)連接,并具有出色的性能表現(xiàn)。

  3. 多協(xié)議支持:Netty支持多種常見的網(wǎng)絡(luò)協(xié)議,如TCP、UDP、HTTP、WebSocket等。它提供了一組相應(yīng)的高級(jí)抽象和組件,使得開發(fā)人員能夠輕松地構(gòu)建基于這些協(xié)議的應(yīng)用程序。Netty的高級(jí)抽象和擴(kuò)展性使得開發(fā)人員能夠自定義和擴(kuò)展協(xié)議的處理邏輯,以滿足特定的需求。

總之,Netty的高級(jí)抽象和擴(kuò)展性使得開發(fā)人員能夠以簡(jiǎn)潔、靈活和高效的方式構(gòu)建網(wǎng)絡(luò)應(yīng)用程序。它提供了豐富的工具和組件,簡(jiǎn)化了網(wǎng)絡(luò)編程的復(fù)雜性,同時(shí)提供了優(yōu)異的性能和可伸縮性。無論是構(gòu)建高性能服務(wù)器、實(shí)時(shí)通信應(yīng)用還是分布式系統(tǒng),Netty都是一個(gè)強(qiáng)大而可靠的選擇。文章來源地址http://www.zghlxwxcb.cn/news/detail-793797.html

到了這里,關(guān)于Netty和傳統(tǒng)NIO之間的比較的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場(chǎng)。本站僅提供信息存儲(chǔ)空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請(qǐng)注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請(qǐng)點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • NIO和netty的常用類

    給ServerBootstrap配置兩個(gè)EventLoopGroup,一個(gè)建立連接,一個(gè)處理網(wǎng)絡(luò)io。 EventLoopGroup給EventLoop分配線程。 在 Netty 中,EventLoop 通過不斷輪詢 Selector 來檢測(cè) Channel 上發(fā)生的事件,當(dāng) Channel 上的事件到達(dá)時(shí),EventLoop 會(huì)將事件傳入 相應(yīng)的Channel 的成員變量 ChannelPipeline 中,經(jīng)過所有C

    2024年01月25日
    瀏覽(19)
  • Netty-01-快速掌握J(rèn)ava NIO

    Netty-01-快速掌握J(rèn)ava NIO

    Blocking IO也稱為BIO,即同步阻塞IO。Java的io包基于流模型實(shí)現(xiàn),提供了File、FileInputStream、FileOutputStream等輸?輸出流的功能。Java的io包下提供的流操作,交互?式是同步且阻塞的?式,在輸?輸出流的操作進(jìn)?讀、寫動(dòng)作完成之前,線程會(huì)?直 阻塞 。因此io包中對(duì)流的操作容易

    2024年02月10日
    瀏覽(25)
  • Java NIO 和 Netty快速入門

    Java NIO 和 Netty快速入門

    channel 是讀寫數(shù)據(jù)的雙向通道,可以從 channel將數(shù)據(jù)讀入buffer,也可以將buffer數(shù)據(jù)寫入channel(較之前的stream要么是輸入,要么是輸出更為底層) 四種常見Channel: FileChannel DatagramChannel SocketChannel ServerSocketChannel buffer用來緩沖讀寫數(shù)據(jù) 常見buffer: ByteBuffer MappedByteBuffer DirectByteBuffer

    2024年02月22日
    瀏覽(19)
  • 以 Java NIO 的角度理解 Netty

    以 Java NIO 的角度理解 Netty

    上篇文章《Netty 入門指南》主要涵蓋了 Netty 的入門知識(shí),包括 Netty 的發(fā)展歷程、核心功能與組件,并且通過實(shí)例演示了如何使用 Netty 構(gòu)建一個(gè) HTTP 服務(wù)器。由于 Netty 的抽象程度較高,因此理解起來可能會(huì)更加復(fù)雜和具有挑戰(zhàn)性,所以本文將通過 Java NIO 的處理流程與 Netty 的

    2024年02月12日
    瀏覽(20)
  • netty(二):NIO——處理可寫事件

    在服務(wù)端一次性無法把數(shù)據(jù)發(fā)送完的情況下,需要注冊(cè)可寫事件 服務(wù)端一次性是否能夠把數(shù)據(jù)全部發(fā)送完成取決于服務(wù)端的緩沖區(qū)大小,該緩沖區(qū)不受程序控制 判斷ByteBuffer是否仍有剩余,如果有剩余注冊(cè)可寫事件 監(jiān)聽可寫事件,判斷數(shù)據(jù)是否寫完,數(shù)據(jù)寫完需要 客戶端 服

    2024年02月11日
    瀏覽(16)
  • Netty Review - NIO空輪詢及Netty的解決方案源碼分析

    Netty Review - NIO空輪詢及Netty的解決方案源碼分析

    Netty Review - ServerBootstrap源碼解析 Netty Review - NioServerSocketChannel源碼分析 Netty Review - 服務(wù)端channel注冊(cè)流程源碼解析 NIO空輪詢(Empty Polling)是指在使用Java NIO 時(shí),當(dāng)Selector上注冊(cè)的Channel沒有就緒事件時(shí),Selector.select()方法會(huì)返回0,但該方法會(huì)導(dǎo)致CPU空轉(zhuǎn),因?yàn)樗鼤?huì)不斷地調(diào)用操

    2024年02月21日
    瀏覽(15)
  • 使用nio代替?zhèn)鹘y(tǒng)流實(shí)現(xiàn)文件上傳和下載功能

    1.文件下載 2.文件上傳

    2024年02月13日
    瀏覽(116)
  • Java NIO 圖解 Netty 服務(wù)端啟動(dòng)的過程

    了解整體Netty常用的核心組件后,并且對(duì)比了傳統(tǒng)IO模式。在對(duì)比過程中,找到了傳統(tǒng)IO對(duì)應(yīng)Netty中是如何實(shí)現(xiàn)的。最后我們了解到在netty中常用的那些組件。 本文在了解下這些核心組件的前提下,進(jìn)一步了解組件如何在整個(gè)服務(wù)器啟動(dòng)過程如何被創(chuàng)建,如何組件之間配合來使

    2024年02月11日
    瀏覽(19)
  • 由淺入深Netty基礎(chǔ)知識(shí)NIO網(wǎng)絡(luò)編程

    由淺入深Netty基礎(chǔ)知識(shí)NIO網(wǎng)絡(luò)編程

    阻塞模式下,相關(guān)方法都會(huì)導(dǎo)致線程暫停 ServerSocketChannel.accept 會(huì)在沒有連接建立時(shí)讓線程暫停 SocketChannel.read 會(huì)在沒有數(shù)據(jù)可讀時(shí)讓線程暫停 阻塞的表現(xiàn)其實(shí)就是線程暫停了,暫停期間不會(huì)占用 cpu,但線程相當(dāng)于閑置 單線程下,阻塞方法之間相互影響,幾乎不能正常工作,

    2024年02月05日
    瀏覽(29)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請(qǐng)作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包