Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >专栏 >【Netty】Netty 入门案例分析 ( Netty 模型解析 | Netty 服务器端代码 | Netty 客户端代码 )

【Netty】Netty 入门案例分析 ( Netty 模型解析 | Netty 服务器端代码 | Netty 客户端代码 )

作者头像
韩曙亮
发布于 2023-03-27 12:46:59
发布于 2023-03-27 12:46:59
2.1K00
代码可运行
举报
运行总次数:0
代码可运行

文章目录

一、 Netty 模型代码解析


1 . 线程池 NioEventLoopGroup :

① NioEventLoopGroup 线程池使用场景 : Netty 模型中的 BossGroup 和 WorkerGroup 都是 NioEventLoopGroup 类型的线程池 ;

② NioEventLoopGroup 默认线程个数 : 系统默认每个线程池中的 NioEventLoop 线程数是 CPU 核数

\times

2 , 下面的代码可以获取运行 Netty 程序的设备的 CPU 核数 ;

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
// 获取设备的 CPU 核数
NettyRuntime.availableProcessors()

③ 指定 NioEventLoopGroup 线程个数 : 如果不想使用 Netty 线程池的默认线程个数 , 可以在 NioEventLoopGroup 构造函数中子星设定线程数 ;

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
// BossGroup 线程池 : 负责客户端的连接
// 指定线程个数 : 客户端个数很少, 不用很多线程维护, 这里指定线程池中线程个数为 1
EventLoopGroup bossGroup = new NioEventLoopGroup(1);

2 . NioEventLoopGroup 线程池线程分配 :

以客户端连接完成后 , 数据读写场景举例 ;

在 双核 CPU 的服务器上 , NioEventLoopGroup 默认有

4

个线程 ; 按照顺序循环分配 , 为第

n

个客户端分配第

n \% 4

个 NioEventLoop 线程 ;

  • 客户端
0

与服务器进行数据交互在 NioEventLoop

0

线程中 ;

  • 客户端
1

与服务器进行数据交互在 NioEventLoop

1

线程中 ;

  • 客户端
2

与服务器进行数据交互在 NioEventLoop

2

线程中 ;

  • 客户端
3

与服务器进行数据交互在 NioEventLoop

3

线程中 ;

  • 客户端
4

与服务器进行数据交互在 NioEventLoop

0

线程中 ;

  • 客户端
5

与服务器进行数据交互在 NioEventLoop

1

线程中 ;

  • 客户端
6

与服务器进行数据交互在 NioEventLoop

2

线程中 ;

  • 客户端
7

与服务器进行数据交互在 NioEventLoop

3

线程中 ;

3 . NioEventLoopGroup 线程池封装内容 :

① NioEventLoopGroup 中的若干个 NioEventLoop 线程都封装在 children 中 , 线程个数是 CPU 核数 2 倍 ;

② 每个 NioEventLoop 线程中封装了如下内容 :

  • 选择器 ( Selector ) , 用于监听客户端的读写 IO 事件 ;
  • 任务队列 ( taskQueue ) , 用于存储事件对应的业务逻辑任务 ;
  • 线程执行器 ( executor ) , 用于执行线程 ;

4 . ChannelHandlerContext 通道处理者上下文对象封装内容 :

① 用户自定义的 处理者 ( Handler ) , 这里指的是 服务器端的 ServerHandr ( 自定义 ) , 客户端的 ClientHandler ( 自定义 ) ;

② 管道 ( ChannelPipeline ) : 其本质是双向链表 , 该 ChannelHandlerContext 可以获取该链表的前一个 ( prev ) , 后一个管道对象 ( next ) ;

③ 管道 与 通道 :

  • 二者都可以通过 通道处理者上下文 ( ChannelHandlerContext ) 获取 ;
  • 管道 与 通道 都可以互相从对方获取 ;
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
Channel channel = ctx.channel();
ChannelPipeline pipeline = ctx.pipeline();
channel = pipeline.channel();
pipeline = channel.pipeline();

④ 管道 ( Pipeline ) 与 通道 ( Channel ) 关联 : 通过管道可以获取通道 , 通过通道也可以获取其对应的管道 ;

5 . 处理者 ( Handler ) :

① 设置 Handler : 给 WorkerGroup 线程池中的 EventLoop 线程对应的管道设置 处理器 ( Handler ) ;

② 自定义 Handler : 一般这个 Handler 都是用户自定义的类 , 继承 ChannelInboundHandlerAdapter 类 ;

③ 运行机制 : 在 BossGroup 中连接客户端成功后 , 将 NioSocketChannel 注册给 WorkerGroup 中的 EventLoop 中的 选择器 ( Selector ) , 如果监听到客户端数据 IO 事件 , 就会调用 管道 ( Pipeline ) 处理该事件 , 管道 ( Pipeline ) 中调用 处理器 ( Handler ) 处理相应的事件 , 该 处理器 ( Handler ) 可以是 Netty 提供的 , 也可以是开发者自定义的 ;

特别注意 : 自定义 Handler 中 , 重写的 ChannelInboundHandlerAdapter 方法 , 将 super() 语句都删除 ;

二、 Netty 案例服务器端代码


1 . 服务器主程序

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
package kim.hsl.netty;

import io.netty.bootstrap.ServerBootstrap;
import io.netty.channel.ChannelFuture;
import io.netty.channel.ChannelInitializer;
import io.netty.channel.ChannelOption;
import io.netty.channel.EventLoopGroup;
import io.netty.channel.nio.NioEventLoopGroup;
import io.netty.channel.socket.SocketChannel;
import io.netty.channel.socket.nio.NioServerSocketChannel;

/**
 * Netty 案例服务器端
 */
public class Server {
    public static void main(String[] args) {

        // 1. 创建 BossGroup 线程池 和 WorkerGroup 线程池, 其中维护 NioEventLoop 线程
        //     NioEventLoop 线程中执行无限循环操作

        // BossGroup 线程池 : 负责客户端的连接
        // 指定线程个数 : 客户端个数很少, 不用很多线程维护, 这里指定线程池中线程个数为 1
        EventLoopGroup bossGroup = new NioEventLoopGroup(1);
        // WorkerGroup 线程池 : 负责客户端连接的数据读写
        EventLoopGroup workerGroup = new NioEventLoopGroup();

        // 2. 服务器启动对象, 需要为该对象配置各种参数
        ServerBootstrap bootstrap = new ServerBootstrap();
        bootstrap.group(bossGroup, workerGroup) // 设置 主从 线程组 , 分别对应 主 Reactor 和 从 Reactor
                .channel(NioServerSocketChannel.class)  // 设置 NIO 网络套接字通道类型
                .option(ChannelOption.SO_BACKLOG, 128)  // 设置线程队列维护的连接个数
                .childOption(ChannelOption.SO_KEEPALIVE, true)  // 设置连接状态行为, 保持连接状态
                .childHandler(  // 为 WorkerGroup 线程池对应的 NioEventLoop 设置对应的事件 处理器 Handler
                        new ChannelInitializer<SocketChannel>() {// 创建通道初始化对象
                            @Override
                            protected void initChannel(SocketChannel ch) throws Exception {
                                // 为 管道 Pipeline 设置处理器 Hanedler
                                ch.pipeline().addLast(new ServerHandr());
                            }
                        }
                );
        System.out.println("服务器准备完毕 ...");

        ChannelFuture cf = null;
        try {
            // 绑定本地端口, 进行同步操作 , 并返回 ChannelFuture
            cf = bootstrap.bind(8888).sync();
            System.out.println("服务器开始监听 8888 端口 ...");
            // 关闭通道 , 开始监听操作
            cf.channel().closeFuture().sync();
        } catch (InterruptedException e) {
            e.printStackTrace();
        } finally {
            // 出现异常后, 优雅的关闭
            bossGroup.shutdownGracefully();
            workerGroup.shutdownGracefully();
        }

    }
}

2 . 服务器自定义 Handler 处理者

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
package kim.hsl.netty;

import io.netty.buffer.ByteBuf;
import io.netty.buffer.Unpooled;
import io.netty.channel.Channel;
import io.netty.channel.ChannelHandlerContext;
import io.netty.channel.ChannelInboundHandlerAdapter;
import io.netty.channel.ChannelPipeline;
import io.netty.util.CharsetUtil;

/**
 * Handler 处理者, 是 NioEventLoop 线程中处理业务逻辑的类
 *
 * 继承 : 该业务逻辑处理者 ( Handler ) 必须继承 Netty 中的 ChannelInboundHandlerAdapter 类
 * 才可以设置给 NioEventLoop 线程
 *
 * 规范 : 该 Handler 类中需要按照业务逻辑处理规范进行开发
 */
public class ServerHandr extends ChannelInboundHandlerAdapter {

    /**
     * 读取数据 : 在服务器端读取客户端发送的数据
     * @param ctx
     *      通道处理者上下文对象 : 封装了 管道 ( Pipeline ) , 通道 ( Channel ), 客户端地址信息
     *      管道 ( Pipeline ) : 注重业务逻辑处理 , 可以关联很多 Handler
     *      通道 ( Channel ) : 注重数据读写
     * @param msg
     *      客户端上传的数据
     * @throws Exception
     */
    @Override
    public void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception {
        // 查看 ChannelHandlerContext 中封装的内容
        System.out.println("channelRead : ChannelHandlerContext ctx = " + ctx);

        // 将客户端上传的数据转为 ByteBuffer
        // 这里注意该类是 Netty 中的 io.netty.buffer.ByteBuf 类
        // 不是 NIO 中的 ByteBuffer
        // io.netty.buffer.ByteBuf 性能高于 java.nio.ByteBuffer
        ByteBuf byteBuf = (ByteBuf) msg;
        // 将 ByteBuf 缓冲区数据转为字符串, 打印出来
        System.out.println(ctx.channel().remoteAddress() + " 接收到客户端发送的数据 : " + 
        	byteBuf.toString(CharsetUtil.UTF_8));
    }

    /**
     * 服务器端读取数据完毕后回调的方法
     * @param ctx
     *      通道处理者上下文对象 : 封装了 管道 ( Pipeline ) , 通道 ( Channel ), 客户端地址信息
     *      *      管道 ( Pipeline ) : 注重业务逻辑处理 , 可以关联很多 Handler
     *      *      通道 ( Channel ) : 注重数据读写
     * @throws Exception
     */
    @Override
    public void channelReadComplete(ChannelHandlerContext ctx) throws Exception {
        // 数据编码 : 将字符串编码, 存储到 io.netty.buffer.ByteBuf 缓冲区中
        ByteBuf byteBuf = Unpooled.copiedBuffer("Hello Client", CharsetUtil.UTF_8);

        // 写出并刷新操作 : 写出数据到通道的缓冲区 ( write ), 并执行刷新操作 ( flush )
        ctx.writeAndFlush(byteBuf);
    }

    /**
     * 异常处理 , 上面的方法中都抛出了 Exception 异常, 在该方法中进行异常处理
     * @param ctx
     * @param cause
     * @throws Exception
     */
    @Override
    public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) throws Exception {
        System.out.println("通道异常, 关闭通道");
        //如果出现异常, 就关闭该通道
        ctx.close();
    }
}

三、 Netty 案例客户端代码


1 . 客户端主程序

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
package kim.hsl.netty;

import io.netty.bootstrap.Bootstrap;
import io.netty.channel.ChannelFuture;
import io.netty.channel.ChannelInitializer;
import io.netty.channel.EventLoopGroup;
import io.netty.channel.nio.NioEventLoopGroup;
import io.netty.channel.socket.SocketChannel;
import io.netty.channel.socket.nio.NioSocketChannel;

public class Client {
    public static void main(String[] args) {
        // 客户端只需要一个 时间循环组 , 即 NioEventLoopGroup 线程池
        EventLoopGroup eventLoopGroup = new NioEventLoopGroup();

        // 客户端启动对象
        Bootstrap bootstrap = new Bootstrap();
        // 设置相关参数
        bootstrap.group(eventLoopGroup)     // 设置客户端的线程池
                .channel(NioSocketChannel.class)    // 设置客户端网络套接字通道类型
                .handler(   // 设置客户端的线程池对应的 NioEventLoop 设置对应的事件处理器 Handler
                        new ChannelInitializer<SocketChannel>() {
                            @Override
                            protected void initChannel(SocketChannel ch) throws Exception {
                                ch.pipeline().addLast(new ClientHandr());
                            }
                        }
                );

        try {
            // 开始连接服务器, 并进行同步操作
            // ChannelFuture 类分析 , Netty 异步模型
            // sync 作用是该方法不会再次阻塞
            ChannelFuture channelFuture = bootstrap.connect("127.0.0.1", 8888).sync();
            System.out.println("客户端连接服务器成功 ...");

            // 关闭通道, 开始监听
            channelFuture.channel().closeFuture().sync();

        } catch (InterruptedException e) {
            e.printStackTrace();
        }finally {
            // 优雅的关闭
            eventLoopGroup.shutdownGracefully();
        }
    }
}

2 . 客户端自定义 Handler 处理者

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
package kim.hsl.netty;

import io.netty.buffer.ByteBuf;
import io.netty.buffer.Unpooled;
import io.netty.channel.ChannelHandlerContext;
import io.netty.channel.ChannelInboundHandlerAdapter;
import io.netty.util.CharsetUtil;

/**
 * Handler 处理者, 是 NioEventLoop 线程中处理业务逻辑的类
 *
 * 继承 : 该业务逻辑处理者 ( Handler ) 必须继承 Netty 中的 ChannelInboundHandlerAdapter 类
 * 才可以设置给 NioEventLoop 线程
 *
 * 规范 : 该 Handler 类中需要按照业务逻辑处理规范进行开发
 */
public class ClientHandr extends ChannelInboundHandlerAdapter {

    /**
     * 通道就绪后触发该方法
     * @param ctx
     * @throws Exception
     */
    @Override
    public void channelActive(ChannelHandlerContext ctx) throws Exception {
        // 查看 ChannelHandlerContext 中封装的内容
        System.out.println("channelActive : ChannelHandlerContext ctx = " + ctx);

        // 数据编码 : 将字符串编码, 存储到 io.netty.buffer.ByteBuf 缓冲区中
        ByteBuf byteBuf = Unpooled.copiedBuffer("Hello Server", CharsetUtil.UTF_8);

        // 写出并刷新操作 : 写出数据到通道的缓冲区 ( write ), 并执行刷新操作 ( flush )
        ctx.writeAndFlush(byteBuf);
        System.out.println("客户端向服务器端发送 Hello Server 成功");
    }

    /**
     * 读取数据 : 在服务器端读取客户端发送的数据
     * @param ctx
     *      通道处理者上下文对象 : 封装了 管道 ( Pipeline ) , 通道 ( Channel ), 客户端地址信息
     *      管道 ( Pipeline ) : 注重业务逻辑处理 , 可以关联很多 Handler
     *      通道 ( Channel ) : 注重数据读写
     * @param msg
     *      服务器返回的数据
     * @throws Exception
     */
    @Override
    public void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception {
        // 查看 ChannelHandlerContext 中封装的内容
        System.out.println("channelRead : ChannelHandlerContext ctx = " + ctx);

        // 将服务器下发的数据转为 ByteBuffer
        // 这里注意该类是 Netty 中的 io.netty.buffer.ByteBuf 类
        // 不是 NIO 中的 ByteBuffer
        // io.netty.buffer.ByteBuf 性能高于 java.nio.ByteBuffer
        ByteBuf byteBuf = (ByteBuf) msg;
        // 将 ByteBuf 缓冲区数据转为字符串, 打印出来
        System.out.println(ctx.channel().remoteAddress() + " 服务器返回的数据 : " + 
        	byteBuf.toString(CharsetUtil.UTF_8));
    }

    /**
     * 异常处理 , 上面的方法中都抛出了 Exception 异常, 在该方法中进行异常处理
     * @param ctx
     * @param cause
     * @throws Exception
     */
    @Override
    public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) throws Exception {
        System.out.println("通道异常, 关闭通道");
        //如果出现异常, 就关闭该通道
        ctx.close();
    }
}

四、 Netty 案例运行


1 . 运行服务器端 : 服务器启动 , 监听 8888 端口 ;

2 . 运行客户端 : 客户端连接服务器的 8888 端口 , 并向服务器端写出 Hello Server 字符串 , 之后便接到服务器端回送的 Hello Client 字符串信息 ;

3 . 查看客户端 : 服务器端接收到客户端信息 , 向客户端写出 Hello Client 字符串 ;

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2020-06-03,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
【Netty】使用 Netty 开发 HTTP 服务器
① HTTP 服务器端 : 在服务器端使用 Netty 开发 HTTP 服务器 , 该 HTTP 服务器监听 8888 端口 ;
韩曙亮
2023/03/27
5920
【Netty】使用 Netty 开发 HTTP 服务器
Netty 线程模型与基本使用
Netty 是一个异步事件驱动的网络应用程序框架,用于快速开发可维护的高性能和高伸缩性的服务器和客户端。Netty 拥有高性能,吞吐量更高,延迟更低,减少资源消耗,最小化不必要的内存复制等优点。
Se7en258
2021/05/18
1.1K0
Netty 线程模型与基本使用
Netty的部分案例实现
Netty简单入门案例实现 server端 package com.shi.netty.netty1.simple; import io.netty.bootstrap.ServerBootstrap; import io.netty.channel.ChannelFuture; import io.netty.channel.ChannelInitializer; import io.netty.channel.ChannelOption; import io.netty.channel.EventL
用户5927264
2020/06/16
6150
Netty第一个入门实例-TCP服务
好了netty的第一个入门案例就到此了,具体的代码解释请多看代码中的注释,有不清楚的欢迎留言交流 O(∩_∩)O哈哈~
用户4919348
2019/12/31
4.9K0
【Netty】使用 Netty 开发 HTTP 服务器 ( HTTP 请求过滤 )
在上述代码案例中 , 运行后 , 服务器端收到了两次 HTTP 请求 , 这里的两次请求 , 一个是请求 http://127.0.0.1:8888/ 地址资源 , 令一个是请求网站的图标 ;
韩曙亮
2023/03/27
1.1K0
【Netty】使用 Netty 开发 HTTP 服务器 ( HTTP 请求过滤 )
09-Netty 高性能架构设计-基于Netty开发TCP服务
Netty快速入门实例-TCP服务 需求 使用IDEA创建Netty项目 Netty服务器在6668端口监听, 客户端能发送消息给服务器"Hello, 服务器~" 服务器可以回复消息给客户端"hello, 客户端~" 目的: 对Netty线程模型 有一个初步认识, 便于理解Netty 模型理论 编写服务端 编写客户端 对Netty程序进行分析, 看看Netty模型特点 添加Netty依赖 <!-- https://mvnrepository.com/artifact/io.netty/netty-all -
彼岸舞
2022/02/18
4970
Netty Review - 核心组件扫盲
如果Handler处理器有一些长时间的业务处理,可以交给taskQueue异步处理。
小小工匠
2023/11/15
5030
Netty Review - 核心组件扫盲
java架构之路-(netty专题)netty的基本使用和netty聊天室
  上次博客,我们主要说了我们的IO模型,BIO同步阻塞,NIO同步非阻塞,AIO基于NIO二次封装的异步非阻塞,最重要的就是我们的NIO,脑海中应该有NIO的模型图。
小菜的不能再菜
2020/02/23
1.3K0
漫谈Java IO之 Netty与NIO服务器
前面介绍了基本的网络模型以及IO与NIO,那么有了NIO来开发非阻塞服务器,大家就满足了吗?有了技术支持,就回去追求效率,因此就产生了很多NIO的框架对NIO进行封装——这就是大名鼎鼎的Netty。 前几篇的内容,可以参考: 网络IO的基本知识与概念 普通IO以及BIO服务器 NIO的使用与服务器Hello world Netty的使用与服务器Hello world 为什么要使用开源框架? 这个问题几乎可以当做废话,框架肯定要比一些原生的API封装了更多地功能,重复造轮子在追求效率的情况并不是明智之举。那
用户1154259
2018/04/10
1.1K0
漫谈Java IO之 Netty与NIO服务器
Netty服务端与客户端(源码一)
  (4)创建Selector,将之前创建的ServerSocketChannel注册到Selector上,监听SelectionKeyACCEPT。
用户3003813
2018/09/06
1.6K0
Netty服务端与客户端(源码一)
Netty Review - Netty自动重连机制揭秘:原理与最佳实践
Netty Review - 深入探讨Netty的心跳检测机制:原理、实战、IdleStateHandler源码分析
小小工匠
2023/12/25
1.4K0
Netty Review - Netty自动重连机制揭秘:原理与最佳实践
Java网络编程--Netty入门
Netty是一个高性能,高可扩展性的异步事件驱动的网络应用程序框架,它极大的简化了TCP和UDP客户端和服务器端网络开发。它是一个NIO框架,对Java NIO进行了良好的封装。作为一个异步NIO框架,Netty的所有IO操作都是异步非阻塞的,通过Future-Listener机制,用户可以方便的主动获取或者通过通知机制获得IO操作结果。
CodingDiray
2019/09/25
5480
Java网络编程--Netty入门
【Java】Netty创建网络服务端客户端(TCP/UDP)
Netty是一个基于Java的异步事件驱动的网络应用程序框架,专门用于快速开发高性能、可扩展和可维护的网络服务器和客户端。它提供了简单而强大的API,使开发人员能够轻松地构建各种网络应用,包括TCP、UDP、HTTP、WebSocket等。
DevFrank
2024/07/24
7950
【Java】Netty创建网络服务端客户端(TCP/UDP)
[netty]-入门案例
学习了netty后,按照例子,编写了入门案例,深入了解netty的执行过程,记录下笔记。
无敌小菜鸟
2022/01/06
5790
[netty]-入门案例
史诗级最强教科书式“NIO与Netty编程”
java.nio全称java non-blocking IO,是指JDK1.4开始提供的新API。从JDK1.4开始,Java提供了一系列改进的输入/输出的新特性,也被称为NIO(既New IO),新增了许多用于处理输入输出的类,这些类都被放在java.nio包及子包下,并且对原java.io包中的很多类进行改写,新增类满足NIO的功能。 NIO和BIO有着相同的目的和作用,但是它们的实现方式完全不同,BIO以流的方式处理数据,而NIO以块的方式处理数据,块I/O的效率比流I/O高很多。另外,NIO是非阻塞式的,这一点跟BIO也很不相同,使用它可以提供非阻塞式的高伸缩性网络。 NIO主要有三大核心部分 :Channel(通道),Buffer(缓冲区),Selector(选择器)。传统的BIO基于字节流和字符流进行操作,而NIO基于Channel和Buffer(缓冲区)进行操作,数据总是从通道读取到缓冲区中,或者从缓冲区写入到通道中。Selector(选择区)用于监听多个通道的事件(比如 :连接打开,数据到达)。因此使用单个线程就可以监听多个数据管道。
海仔
2019/08/26
9270
史诗级最强教科书式“NIO与Netty编程”
Netty入门篇
2、Netty简介: netty是一个异步的,基于事件驱动的网络应用框架。可以快速地开发高性能的服务器端和客户端,像dubbo和elasticsearch底层都用了netty。它具有以下优点:
贪挽懒月
2020/07/28
8040
Netty入门篇
netty 入门
我们一般会用Http客户端库来调用web服务,获取数据。如果一个东西是出于一般性目的设计出来的,那么他在某些方面可能就不是最合适的。比如获取大文件,收发邮件,展示实时的金融数据,游戏数据传输等。为了实现这些需求,需要一个为其高度优化的特定协议。还有一个无法避免的问题是你可能需要调用老系统的数据,但是他的协议又是特定。重点来了,如何在不牺牲可靠性和性能的前提下快速实现这么一个系统。
_淡定_
2020/05/12
7730
Netty框架
Netty 是由 JBOSS 提供的一个 Java 开源框架。Netty 提供异步的、基于事件驱动的网络应用程序框架,用以快速开发高性能、高可靠性的网络 IO 程序。
全栈程序员站长
2022/07/22
3600
Netty框架
【Netty】Netty 核心组件 ( Future | Channel | Selector | ChannelHandler )
1 . Netty 中的 IO 操作 : Netty 中的 IO 操作 , 如 数据读取 Read , 数据写出 Write , 接受客户端连接 Accept , 连接服务器 Connect 等
韩曙亮
2023/03/27
1.6K0
[自己做个游戏服务器二] 游戏服务器的基石-Netty全解析
Netty的大名我想做java 的基本都知道,因为他实在太出名了,现在很多著名的软件都是使用netty作为通讯基础,今天就聊聊Netty,希望能讲清楚,如果懒得看理论,可以直接拉到后面看Hello world。把代码抄下来,运行一下看看。
香菜聊游戏
2021/10/19
1.7K0
[自己做个游戏服务器二] 游戏服务器的基石-Netty全解析
相关推荐
【Netty】使用 Netty 开发 HTTP 服务器
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验