Netty分布式Server启动流程服务端初始化源码分析

Netty分布式Server启动流程服务端初始化源码分析

概述

Netty是一个高性能的基于Java NIO的网络编程框架,可以实现异步的、事件驱动的网络应用程序。

本文将对Netty分布式Server启动流程的服务端初始化源码进行详细分析,从源码实现的角度解析Netty分布式Server启动流程,并提供两个具体的示例来说明。

Netty分布式Server启动流程服务端初始化源码分析

Netty分布式Server启动流程

Netty分布式Server启动流程如下:

  1. ServerBootstrap:启动Netty的Server端,包括配置Server的参数、设置Server线程、设置ChannelHandler等。
  2. group:创建线程池,来处理任务的执行。Server的Channel接收到客户端的连接后,将会产生一个Channel实例。这个Channel实例会被提交给一个EventLoopGroup实例中的一个EventLoop来处理,实现任务的异步处理。
  3. ServerChannel:是一个特殊的Channel类型,主要作用是接收客户端的连接请求,并为每个连接创建一个对应的SocketChannel。
  4. ChannelInitializer:用于初始化Channel,配置Channel的ChannelHandler,定义 ChannelInitializer 的时候可以添加多个ChannelHandler。
  5. ChannelHandler:处理业务逻辑,例如编解码、数据传输、心跳检测等。

服务端初始化源码分析

创建连接线程池

EventLoopGroup bossGroup = new NioEventLoopGroup();
EventLoopGroup workGroup = new NioEventLoopGroup();

以上代码创建了两个线程池,一个是用于处理 ServerSocketChannel 的 boss 线程组,另一个是用于处理 SocketChannel 的 work 线程组。

创建ServerBootstrap

ServerBootstrap bootstrap = new ServerBootstrap();

通过 ServerBootstrap 类创建服务器端启动引导类。

配置Server参数

bootstrap.group(bossGroup, workGroup)
        .channel(NioServerSocketChannel.class)
        .option(ChannelOption.SO_BACKLOG, 1024)
        .option(ChannelOption.TCP_NODELAY, true)
        .childHandler(new ChannelInitializer<SocketChannel>() {
            @Override
            protected void initChannel(SocketChannel ch) throws Exception {
                // 添加处理器
                ch.pipeline().addLast(new MyHandler());
            }
        });
  • bootstrap.group(bossGroup, workGroup):设置EventLoopGroup。
  • bootstrap.channel(NioServerSocketChannel.class):指定使用NioServerSocketChannel作为服务器的通道实现。
  • bootstrap.option(ChannelOption.SO_BACKLOG, 1024):设置TCP参数,即最大等待客户端连接数。
  • bootstrap.option(ChannelOption.TCP_NODELAY, true):设置TCP参数,禁用 Nagle 算法。如果要求高实时性,有数据发送时就马上发送,就将该选项设置为 true。
  • bootstrap.childHandler(new ChannelInitializer<SocketChannel>() {...}):添加处理器,用于初始化 SocketChannel。

启动服务器

ChannelFuture future = bootstrap.bind(8888).sync();

通过 bind 方法绑定公网 IP 和端口,等待客户端连接,启动服务器。

到此为止,Netty分布式Server的服务端初始化源码分析结束。

示例说明

示例1

在这个示例中,我们将启动一个基于Netty的Server端,并监听指定的IP和端口。每当有客户端连接上来后,就向客户端发送消息。

public class NettyServer {

    public static void main(String[] args) throws InterruptedException {

        // bossGroup 用于处理连接请求
        EventLoopGroup bossGroup = new NioEventLoopGroup();
        // workGroup 用于数据处理
        EventLoopGroup workGroup = new NioEventLoopGroup();

        try {
            // 创建 ServerBootstrap 对象
            ServerBootstrap bootstrap = new ServerBootstrap();
            // 设置 EventLoopGroup
            bootstrap.group(bossGroup, workGroup)
                    // 设置 Channel 类型
                    .channel(NioServerSocketChannel.class)
                    // 设置 ChannelHandler
                    .childHandler(new ChannelInitializer<SocketChannel>() {
                        // 初始化 Channel
                        @Override
                        protected void initChannel(SocketChannel ch) throws Exception {
                            ch.pipeline().addLast(new StringDecoder(CharsetUtil.UTF_8));
                            ch.pipeline().addLast(new StringEncoder(CharsetUtil.UTF_8));
                            ch.pipeline().addLast(new SimpleChannelInboundHandler<String>() {
                                @Override
                                protected void channelRead0(ChannelHandlerContext ctx, String msg) throws Exception {
                                    // 打印收到的消息
                                    System.out.println("Server receive message:" + msg);
                                    // 向客户端发送消息
                                    ctx.writeAndFlush("Server reply message:" + msg);
                                }
                            });
                        }
                    });

            // 绑定端口
            ChannelFuture future = bootstrap.bind(8080).sync();
            // 阻塞线程,知道服务器关闭
            future.channel().closeFuture().sync();
        } finally {
            // 关闭 EventLoopGroup
            bossGroup.shutdownGracefully();
            workGroup.shutdownGracefully();
        }
    }
}

以上代码启动的Server端监听的是本机的8080端口,将客户端发来的消息逆发回去(加上"Server reply message:"前缀)。

示例2

在这个示例中,我们将启动一个基于Netty的Server端,并监听指定的IP和端口。每当有客户端连接上来后,就向客户端随机发送一个Emoji表情。

public class NettyServer {

    public static void main(String[] args) throws InterruptedException {

        // bossGroup 用于处理连接请求
        EventLoopGroup bossGroup = new NioEventLoopGroup();
        // workGroup 用于数据处理
        EventLoopGroup workGroup = new NioEventLoopGroup();

        try {
            // 创建 ServerBootstrap 对象
            ServerBootstrap bootstrap = new ServerBootstrap();
            // 设置 EventLoopGroup
            bootstrap.group(bossGroup, workGroup)
                    // 设置 Channel 类型
                    .channel(NioServerSocketChannel.class)
                    // 设置 ChannelOption
                    .option(ChannelOption.SO_BACKLOG, 128)
                    .childOption(ChannelOption.SO_KEEPALIVE, true)
                    // 设置 ChannelHandler
                    .childHandler(new ChannelInitializer<SocketChannel>() {
                        // 初始化 Channel
                        @Override
                        protected void initChannel(SocketChannel ch) throws Exception {
                            ch.pipeline().addLast(new EmojiEncoder());
                            ch.pipeline().addLast(new SimpleChannelInboundHandler<Object>() {
                                private Random random = new Random();

                                @Override
                                protected void channelRead0(ChannelHandlerContext ctx, Object msg) throws Exception {
                                    // 向客户端发送随机Emoji表情
                                    ChannelFuture future = ctx.writeAndFlush(new Emoji(random.nextInt(10)));
                                    future.addListener(ChannelFutureListener.CLOSE);
                                }
                            });
                        }
                    });

            // 绑定端口
            ChannelFuture future = bootstrap.bind(8080).sync();
            // 阻塞线程,知道服务器关闭
            future.channel().closeFuture().sync();
        } finally {
            // 关闭 EventLoopGroup
            bossGroup.shutdownGracefully();
            workGroup.shutdownGracefully();
        }
    }

    private static class EmojiEncoder extends MessageToMessageEncoder<CharSequence> {
        @Override
        protected void encode(ChannelHandlerContext ctx, CharSequence msg, List<Object> out) throws Exception {
            for (int i = 0; i < msg.length(); i++) {
                out.add(new Emoji(msg.charAt(i)));
            }
        }
    }

    private static class Emoji {
        private int code;

        public Emoji(int code) {
            this.code = code;
        }

        @Override
        public String toString() {
            return new String(Character.toChars(code));
        }
    }
}

以上代码启动的Server端监听的是本机的8080端口,每当客户端连接上来后就随机发送一个Emoji表情回去。在此代码中,我们自定义了两个类 EmojiEncoder 和 Emoji,其中 EmojiEncoder 继承了 MessageToMessageEncoder 并对 CharSequence 进行编码,Emoji 模拟了一个 Emoji 表情。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Netty分布式Server启动流程服务端初始化源码分析 - Python技术站

(0)
上一篇 2023年6月20日
下一篇 2023年6月20日

相关文章

  • MAC如何自定义应用工具栏让其更具个性

    下面就为您详细讲解如何自定义应用工具栏。 1. 什么是应用工具栏 应用工具栏指的是应用程序窗口上方的一排工具按钮,这些按钮可以帮助用户快捷地执行一些常见的操作。在Mac上,很多应用程序都提供了自定义工具栏的功能,让用户能够根据自己的使用习惯,将常用操作放在工具栏上,以方便操作。 2. 如何自定义应用工具栏 以下是自定义应用工具栏的步骤: 打开应用程序。在菜单…

    other 2023年6月25日
    00
  • Listloading.js移动端上拉下拉刷新组件

    下面是对“Listloading.js移动端上拉下拉刷新组件”的完整攻略。 介绍 Listloading.js是一款移动端上拉下拉刷新组件,可以很方便地实现下拉刷新、上拉加载更多的功能。它是使用原生JavaScript实现的,无需依赖其他框架。 安装 可以通过以下方式安装Listloading.js: 下载源代码,将其中的listloading.min.js…

    other 2023年6月25日
    00
  • ASP.NET中BulletedList列表控件使用及详解

    下面是“ASP.NET中BulletedList列表控件使用及详解”的完整攻略。 ASP.NET中BulletedList列表控件使用及详解 什么是BulletedList列表控件? BulletedList控件是ASP.NET Web Forms中的一种列表控件,它可以轻松地创建一个无序列表,可以用来显示一组项目。通常情况下,BulletedList控件的…

    other 2023年6月26日
    00
  • WinXP、Win7、Win8系统的电脑动态IP地址设置方法图文教程

    WinXP、Win7、Win8系统的电脑动态IP地址设置方法图文教程 1. 打开网络连接设置 首先,我们需要打开网络连接设置界面。在WinXP系统中,可以通过以下步骤打开: 单击\”开始\”按钮,选择\”控制面板\”。 在控制面板中,双击\”网络连接\”图标。 在Win7和Win8系统中,可以通过以下步骤打开: 单击\”开始\”按钮,选择\”控制面板\”。 …

    other 2023年7月30日
    00
  • Win10系统桌面图标布局很乱的四种解决方法

    以下是“Win10系统桌面图标布局很乱的四种解决方法”的详细攻略: 一、手动调整图标位置 通常情况下,Win10系统桌面图标布局不是很整齐,可以通过手动调整图标位置实现布局的规整。具体操作步骤如下: 鼠标右键点击桌面空白处,选择“查看”,勾选“对齐图标到网格”。 鼠标左键点击要移动的图标,不松开鼠标,将图标拖拽到目标位置即可。 需要注意的是,手动调整图标位置…

    other 2023年6月26日
    00
  • 如何设置公众号自定义菜单

    当你申请开通微信公众号后,通常很快会想到设置个性化的自定义菜单。设置自定义菜单可以方便用户在公众号操作界面上直接点击所需的功能按钮,提高用户的使用体验。下面我们就来详细讲解如何设置公众号自定义菜单。 第一步:准备工作 在设置自定义菜单之前,需要先做一些准备工作: 登录微信公众平台; 进入“开发”->“基本配置”页面,开启服务号; 进入“开发”->…

    other 2023年6月25日
    00
  • android实现文件上传功能(upload)

    Android实现文件上传功能(upload) 在移动设备上使用上传功能已经成为了许多应用程序的基础。开发人员需要熟悉不同平台和技术,以实现这一功能。本文将介绍如何在Android应用程序中实现文件上传功能。 环境 在开始解释如何实现文件上传功能之前,让我们看一下开发环境。在本文中,我们将使用Android Studio开发环境,Android设备采用API…

    其他 2023年3月28日
    00
  • 命令行使用支持断点续传的java多线程下载器

    下面是“命令行使用支持断点续传的Java多线程下载器”的完整攻略。 一、需求分析 首先,我们需要明确下载器的需求,即实现在命令行下进行多线程下载,并支持断点续传功能,以提高下载速度和下载成功率。 二、实现过程 1.多线程下载实现 要实现多线程下载,我们需要使用Java中的多线程技术,具体的实现步骤如下: 首先,我们需要确定要下载的文件大小; 然后,根据要下载…

    other 2023年6月26日
    00
合作推广
合作推广
分享本页
返回顶部