Rumah  >  Artikel  >  Java  >  Menggunakan Netty5 untuk komunikasi TCP dalam pembangunan API Java

Menggunakan Netty5 untuk komunikasi TCP dalam pembangunan API Java

王林
王林asal
2023-06-18 08:31:241515semak imbas

Dalam pembangunan API Java, komunikasi TCP ialah komponen yang sangat penting, dan Netty5 ialah rangka kerja komunikasi rangkaian berprestasi tinggi berdasarkan NIO, yang boleh mengendalikan tugas komunikasi rangkaian yang kompleks dengan sangat mudah. Artikel ini akan memperkenalkan cara menggunakan Netty5 untuk komunikasi TCP, termasuk komponen teras Netty5, pengenalan kepada API biasa dan kes aplikasi praktikal. Pada masa yang sama, artikel ini juga akan memperkenalkan cara menggunakan Netty5 untuk meningkatkan prestasi dan kebolehpercayaan komunikasi TCP.

1. Komponen teras Netty5

Komponen teras Netty5 termasuk Channel, EventLoop, Codec, Handler dan Bootstrap. Antaranya, Saluran mewakili sambungan terbuka yang boleh membaca dan menulis data. EventLoop ialah kumpulan benang yang digunakan untuk mengendalikan semua acara dalam Netty5. Codec ialah satu set codec yang bertanggungjawab untuk menukar data daripada bytecode kepada objek, dan objek kepada bytecode. Pengendali ialah salah satu komponen terpenting dalam Netty5, bertanggungjawab untuk mengendalikan status sambungan, acara baca dan tulis serta acara pengecualian. Akhir sekali, Bootstrap ialah kelas utama yang digunakan dalam Netty5 untuk mengkonfigurasi, memulakan dan mengurus Netty.

2. Pengenalan kepada API yang biasa digunakan

  1. Buat bahagian Pelayan
ServerBootstrap serverBootstrap = new ServerBootstrap();
NioEventLoopGroup bossGroup = new NioEventLoopGroup();
NioEventLoopGroup workGroup = new NioEventLoopGroup();

serverBootstrap.group(bossGroup, workGroup)
                .channel(NioServerSocketChannel.class)
                .localAddress(new InetSocketAddress(port))
                .childHandler(new ChannelInitializer<SocketChannel>() {
                    @Override
                    public void initChannel(SocketChannel socketChannel) {
                        socketChannel.pipeline().
                        addLast(new CodecHandler(Encoding.getEncoding()),new TcpServerHandler());
                    }
                });

ChannelFuture f = serverBootstrap.bind().sync();
  1. Buat bahagian Klien
rreee
  1. Buat ChannelInboundHandlerAdapter
Bootstrap bootstrap = new Bootstrap();
bootstrap.group(new NioEventLoopGroup())
                .channel(NioSocketChannel.class)
                .remoteAddress(new InetSocketAddress(ip, port))
                .handler(new ChannelInitializer<SocketChannel>() {
                    @Override
                    public void initChannel(SocketChannel ch) throws Exception {

                        ch.pipeline().addLast(new CodecHandler(Encoding.getEncoding()),new TcpClientHandler());
                    }
                });

ChannelFuture f = bootstrap.connect().sync();
  1. Buat ChannelOutboundHandlerAdapter
public class TcpServerHandler extends ChannelInboundHandlerAdapter {
    
        @Override
        public void channelRead(ChannelHandlerContext ctx, Object msg){
            //处理读事件
        }
    
        @Override
        public void channelReadComplete(ChannelHandlerContext ctx){
            ctx.flush();
        }
    
        @Override
        public void exceptionCaught(ChannelHandlerContext ctx,Throwable cause){
            //处理异常事件
        }
    }

Kes aplikasi praktikal berikut

kes praktikal Untuk memperkenalkan cara menggunakan Netty5 untuk komunikasi TCP.

Perihalan kes: Katakan terdapat sistem peperiksaan dalam talian yang perlu menggunakan protokol TCP untuk menyampaikan jawapan peperiksaan kepada pelayan.

    Kod sisi pelayan:
  1. public class TcpClientHandler extends ChannelOutboundHandlerAdapter {
        
            @Override
            public void write(ChannelHandlerContext ctx, Object msg,
                    ChannelPromise promise) {
                //处理写事件
            }
        
            @Override
            public void exceptionCaught(ChannelHandlerContext ctx,Throwable cause){
                //处理异常事件
            }
        }
    Kod sisi pelanggan:
  1. public class ExamServer {
        public static void main(String[] args) throws InterruptedException {
            int port = 8080;
            if (args.length > 0){
                port = Integer.parseInt(args[0]);
            }
            ServerBootstrap serverBootstrap = new ServerBootstrap();
            NioEventLoopGroup bossGroup = new NioEventLoopGroup();
            NioEventLoopGroup workGroup = new NioEventLoopGroup();
            serverBootstrap.group(bossGroup, workGroup)
                    .channel(NioServerSocketChannel.class)
                    .localAddress(new InetSocketAddress(port))
                    .childHandler(new ChannelInitializer<SocketChannel>() {
                        @Override
                        public void initChannel(SocketChannel socketChannel) {
                            socketChannel.pipeline()
                            .addLast(new CodecHandler(Encoding.getEncoding()),new TcpServerHandler());
                        }
                    });
            ChannelFuture f = serverBootstrap.bind().sync();
            //等待服务器监听端口关闭
            f.channel().closeFuture().sync();
        }
    }
    Membaca dan menulis ujian data
  1. public class ExamClient {
        public static void main(String[] args) throws InterruptedException {
            String host = "localhost";
            int port = 8080;
    
            Bootstrap bootstrap = new Bootstrap();
            bootstrap.group(new NioEventLoopGroup())
                    .channel(NioSocketChannel.class)
                    .remoteAddress(new InetSocketAddress(host, port))
                    .handler(new ChannelInitializer<SocketChannel>() {
                        @Override
                        public void initChannel(SocketChannel ch) throws Exception {
                            ch.pipeline()
                            .addLast(new CodecHandler(Encoding.getEncoding()),new TcpClientHandler());
                        }
                    });
            ChannelFuture f = bootstrap.connect().sync();
            //一直等到channel关闭
            f.channel().closeFuture().sync();
        }
    }
    rrree
4. Pengoptimuman prestasi Netty5

Selain fungsi hebat Netty5, prestasinya juga merupakan perbezaan terbesar antaranya dan rangka kerja komunikasi rangkaian yang lain. Dalam aplikasi praktikal, kita biasanya perlu mempertimbangkan cara untuk meningkatkan lagi prestasi Netty5. Berikut ialah beberapa kaedah pengoptimuman prestasi Netty5 yang biasa digunakan.

    Pengoptimuman kumpulan benang
EventLoop Netty5 ialah kumpulan benang untuk pemprosesan acara, jadi saiz kumpulan benang secara langsung mempengaruhi prestasi Netty5. Jika kolam benang terlalu besar, ia akan membawa kepada pembaziran sumber CPU yang berlebihan, sekali gus menjejaskan prestasi sebaliknya, jika kolam benang terlalu kecil, kecekapan pemprosesan serentak mungkin terjejas dengan serius; Adalah disyorkan untuk melaraskan saiz kumpulan benang dengan sewajarnya mengikut senario aplikasi dan konfigurasi perkakasan pelayan.

    Pemprosesan paket mesej
Memandangkan komunikasi TCP berorientasikan aliran, iaitu, paket data boleh dibahagikan kepada beberapa paket kecil untuk penghantaran. Untuk memastikan integriti dan ketepatan data, kami perlu mensubkontrakkan mesej tersebut. Dalam Netty5, anda boleh menggunakan LengthFieldBasedFrameDecoder untuk pemprosesan paket mesej.

    Pengoptimuman Cache
Netty5 menyokong strategi caching tersuai, yang boleh dioptimumkan mengikut senario aplikasi dan keperluan perniagaan. Sebagai contoh, anda boleh menetapkan saiz cache dan masa tamat tempoh yang sesuai berdasarkan saiz dan kekerapan kandungan cache untuk mengelakkan kemerosotan prestasi yang disebabkan oleh saiz cache atau tamat tempoh yang berlebihan.

Kesimpulan

Artikel ini memperkenalkan cara menggunakan Netty5 untuk komunikasi TCP, termasuk komponen teras Netty5, pengenalan kepada API biasa dan kes aplikasi praktikal. Pada masa yang sama, ia juga memperkenalkan cara menggunakan Netty5 untuk meningkatkan prestasi dan kebolehpercayaan komunikasi TCP. Saya berharap pembaca dapat memahami Netty5 dengan lebih baik melalui kajian artikel ini dan menggunakannya secara fleksibel dalam projek sebenar.

Atas ialah kandungan terperinci Menggunakan Netty5 untuk komunikasi TCP dalam pembangunan API Java. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn