前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >学习Netty BootStrap的核心知识,成为网络编程高手!

学习Netty BootStrap的核心知识,成为网络编程高手!

作者头像
JavaEdge
发布于 2023-05-21 01:16:15
发布于 2023-05-21 01:16:15
48800
代码可运行
举报
文章被收录于专栏:JavaEdgeJavaEdge
运行总次数:0
代码可运行

0 定义

深入 ChannelPipeline、ChannelHandler 和 EventLoop 后,如何将这些部分组织起来,成为可运行的应用程序?

引导(Bootstrapping)!引导一个应用程序是指对它进行配置,并使它运行起来的过程—尽管该过程的具体细节可能并不如它的定义那样简单,尤其是对于一个网络应用程序来说。

和它对应用程序体系架构的分层抽象一致,Netty处理引导的方式使你的【应用程序的逻辑或实现】和【网络层】相

隔离,而无论它是客户端还是服务器。所有的框架组件都将会在后台结合在一起并启用。引导是我们一直以来都在组装的完整拼图(Netty 的核心概念以及组件,也包括如何完整正确地组织并且运行一个 Netty 应用程序)中缺失的那一块。当你把它放到正确的位置上时,你的Netty应用程序就完整了。

1 Bootstrap 类

引导类的层次结构包括一个抽象父类和两个具体的引导子类:

相比于将具体的引导类分别看作用于服务器、客户端的引导,记住它们的本意是用来支撑不同的应用程序的功能的更有裨益,即:

  • 服务器致力于使用一个父 Channel 接受来自客户端的连接,并创建子 Channel 用于它们之间的通信
  • 而客户端将最可能只需要一个单独的、没有父 Channel 的 Channel 用于所有的网络交互 正如同我们将看到的,这也适用于无连接的传输协议,如 UDP,因为它们并不是每个连接都需要一个单独的 Channel

客户端和服务器两种应用程序类型之间通用的引导步骤由 AbstractBootstrap 处理,而特定于客户端或服务器的引导步骤则分别由 Bootstrap 或 ServerBootstrap 处理。

接下来将详细地探讨这两个类,首先从不那么复杂的 Bootstrap 类开始。

1.1 为何引导类是 Cloneable

有时可能需要创建多个类似或完全相同配置的Channel。为支持这种模式而又无需为每个 Channel 都创建并配置一个新的引导类实例, AbstractBootstrap 被标记为 Cloneable。在一个已配置完成的引导类实例上调用clone()方法将返回另一个可立即使用的引导类实例。

这种方式只会创建引导类实例的EventLoopGroup的浅拷贝,所以,【被浅拷贝的 EventLoopGroup】将在所有克隆的Channel实例之间共享。这能接受,因为通常这些克隆的Channel的生命周期都很短暂,一个典型场景:创建一个Channel以进行一次HTTP请求。

AbstractBootstrap 类的完整声明:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
// 子类型 B 是其父类型的一个类型参数,因此可以返回到运行时实例的引用以支持方法的链式调用(流式语法)
public abstract class AbstractBootstrap<B extends AbstractBootstrap<B, C>, C extends Channel> implements Cloneable {

其子类的声明:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
public class Bootstrap extends AbstractBootstrap<Bootstrap, Channel> {
}

public class ServerBootstrap extends AbstractBootstrap<ServerBootstrap, ServerChannel> {
}

2 引导客户端和无连接协议

Bootstrap类被用于客户端或使用了无连接协议的应用程序。表8-1很多继承自AbstractBootstrap:

2.1 引导客户端

Bootstrap 类负责为客户端和使用无连接协议的应用程序创建 Channel,如图 8-2:

代码清单 8-1 引导了一个使用 NIO TCP 传输的客户端。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
代码清单 8-1:引导一个客户端

EventLoopGroup group = new NioEventLoopGroup();
// 创建一个Bootstrap类的实例,以创建和连接新的客户端
Channel
Bootstrap bootstrap = new Bootstrap();

/**
 * 使用流式语法;这些方法(除了connect()方法)将通过每次方法调用所返回的对 Bootstrap 实例的引用
 * 链接在一起。
 */

// 设置 EventLoopGroup,提供用于处理 Channel 事件的 EventLoop
bootstrap.group(group)
  			 // 指定要使用的 Channel 实现
        .channel(NioSocketChannel.class)
  			 // 设置用于 Channel 事件和数据的ChannelInboundHandler
        .handler(new SimpleChannelInboundHandler<ByteBuf>() {
            @Override
            protected void channelRead0(
                    ChannelHandlerContext channelHandlerContext,
                    ByteBuf byteBuf) throws Exception {
                System.out.println("Received data");
            }
        });
// 连接到远程主机
ChannelFuture future = bootstrap.connect(new InetSocketAddress("www.JavaEdge.com", 80));
future.addListener(new ChannelFutureListener() {
    @Override
    public void operationComplete(ChannelFuture channelFuture) throws Exception {
        if (channelFuture.isSuccess()) {
            System.out.println("Connection established");
        } else {
            System.err.println("Connection attempt failed");
            channelFuture.cause().printStackTrace();
        }
    }
});

2.2 Channel 和 EventLoopGroup 的兼容性

代码清单 8-2 所示目录清单来自 io.netty.channel 包。从包名及类名前缀可见,对 NIO 及 OIO 传输,都有相关EventLoopGroup 和 Channel 实现。

相互兼容的 EventLoopGroup 和 Channel:

必须保持这种兼容性,不能混用具有不同前缀的组件,如 NioEventLoopGroup 和 OioSocketChannel。代码清单 8-3 展示了试图这样做的一个例子

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
EventLoopGroup group = new NioEventLoopGroup();
// 创建一个新的 Bootstrap类的实例,以创建新的客户端Channel
Bootstrap bootstrap = new Bootstrap();
// 指定一个适用于 NIO 的 EventLoopGroup 实现
bootstrap.group(group)
  			 // 指定一个适用于OIO 的 Channel 实现类
        .channel(OioSocketChannel.class)
  			 // 设置一个用于处理 Channel的 I/O 事件和数据的ChannelInboundHandler
        .handler(new SimpleChannelInboundHandler<ByteBuf>() {
            @Override
            protected void channelRead0(ChannelHandlerContext channelHandlerContext, ByteBuf byteBuf)
                    throws Exception {
                System.out.println("Received data");
            }
        });
// 尝试连接到远程节点
ChannelFuture future = bootstrap.connect(new InetSocketAddress("www.JavaEdge.com", 80));
future.syncUninterruptibly();

这段代码将会导致 IllegalStateException,因为它混用了不兼容的传输

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
Exception in thread "main" java.lang.IllegalStateException: incompatible event loop type: io.netty.channel.nio.NioEventLoop
	at io.netty.channel.AbstractChannel$AbstractUnsafe.register(AbstractChannel.java:462)
IllegalStateException

引导的过程中,在调用 bind()或 connect()前,必须调用以下方法来设置所需的组件:

  • group()
  • channel()或者 channelFactory()
  • handler()

若不这样做,将导致 IllegalStateException。对 handler()方法的调用尤其重要,因为它需要配置好 ChannelPipeline。

3 引导服务器

从 ServerBootstrap API 概要视图开始对服务器引导过程的概述。然后,探讨引导服务器过程中所涉及的几个步骤及几个相关的主题,包含从一个 ServerChannel 的子 Channel 中引导一个客户端这样的特殊情况。

3.1 ServerBootstrap 类

表 8-2 列出了 ServerBootstrap 类的方法:

3.2 引导服务器

表 8-2 中列出一些表 8-1 不存在的方法:childHandler()、childAttr()和 childOption()。这些调用支持特别用于服务器应用程序的操作。

ServerChannel 的实现负责创建子 Channel,这些子 Channel 代表了已被接受的连接。因此,负责引导 ServerChannel 的 ServerBootstrap 提供了这些方法,以简化将设置应用到已被接受的子 Channel 的 ChannelConfig 的任务。

图 8-3 展示 ServerBootstrap 在 bind()方法被调用时创建了一个 ServerChannel,并且该 ServerChannel 管理了多个子 Channel。

代码8-4 实现图 8-3 中所展示的服务器的引导过程:

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

import io.netty.bootstrap.ServerBootstrap;
import io.netty.buffer.ByteBuf;
import io.netty.channel.ChannelFuture;
import io.netty.channel.ChannelFutureListener;
import io.netty.channel.ChannelHandlerContext;
import io.netty.channel.SimpleChannelInboundHandler;
import io.netty.channel.nio.NioEventLoopGroup;
import io.netty.channel.socket.nio.NioServerSocketChannel;

import java.net.InetSocketAddress;

/**
 * 代码清单 8-4 引导服务器
 *
 * @author JavaEdge
 * @date 2023/5/20
 */
public class Demo84 {

    public static void main(String[] args) {
        NioEventLoopGroup group = new NioEventLoopGroup();
        // 创建 ServerBootstrap
        ServerBootstrap bootstrap = new ServerBootstrap();
        // 设置 EventLoopGroup,其提供了用于处理Channel 事件的EventLoop
        bootstrap.group(group)
                // 指定要使用的 Channel 实现
                .channel(NioServerSocketChannel.class)
                // 设置用于处理已被接受的子Channel的I/O及数据的 ChannelInboundHandler
                .childHandler(new SimpleChannelInboundHandler<ByteBuf>() {
                    @Override
                    protected void channelRead0(ChannelHandlerContext ctx, ByteBuf byteBuf) throws Exception {
                        System.out.println("Received data");
                    }
                });
        // 通过配置好的ServerBootstrap的实例绑定该Channel
        ChannelFuture future = bootstrap.bind(new InetSocketAddress(8080));
        future.addListener(new ChannelFutureListener() {
            @Override
            public void operationComplete(ChannelFuture channelFuture) throws Exception {
                if (channelFuture.isSuccess()) {
                    System.out.println("Server bound");
                } else {
                    System.err.println("Bound attempt failed");
                    channelFuture.cause().printStackTrace();
                }
            }
        });
    }
}

4 从 Channel 引导客户端

服务器正在处理一个客户端请求,该请求需要它充当第三方系统的客户端。当一个应用程序(如一个代理服务器)必须要和现有的系统(如 Web 服务或数据库)集成时,就可能发生这种情况。此时,将需要从已被接受的子 Channel 中引导一个客户端 Channel。

可按 8.2.1 节中所描述的方式创建新的 Bootstrap 实例,但是这并不是最高效的解决方案,因为它要求你为每个新创建的客户端 Channel 定义另一个 EventLoop,会产生额外的线程,以及在已被接受的子 Channel 和客户端 Channel 之间交换数据时不可避免的上下文切换。

更好的解决方案

将已被接受的子 Channel 的 EventLoop 传递给 Bootstrap 的 group()方法来共享该 EventLoop。因为分配给 EventLoop 的所有 Channel 都使用同一线程,所以这避免了:

  • 额外的线程创建
  • 前面所提到的相关的上下文切换

该共享的解决方案图:

实现 EventLoop 共享涉及通过调用 group()方法来设置 EventLoop,如代码8-5:

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

import io.netty.bootstrap.Bootstrap;
import io.netty.bootstrap.ServerBootstrap;
import io.netty.buffer.ByteBuf;
import io.netty.channel.ChannelFuture;
import io.netty.channel.ChannelFutureListener;
import io.netty.channel.ChannelHandlerContext;
import io.netty.channel.SimpleChannelInboundHandler;
import io.netty.channel.nio.NioEventLoopGroup;
import io.netty.channel.socket.nio.NioServerSocketChannel;
import io.netty.channel.socket.nio.NioSocketChannel;

import java.net.InetSocketAddress;

/**
 * 代码清单 8-5 引导服务器
 *
 * @author JavaEdge
 * @date 2023/5/20
 */
public class Demo85 {

    public static void main(String[] args) {
        // 创建 ServerBootstrap 以创建ServerSocketChannel,并绑定它
        ServerBootstrap serverBootstrap = new ServerBootstrap();
        // 设置 EventLoopGroup,其将提供用以处理 Channel 事件的 EventLoop
        serverBootstrap.group(new NioEventLoopGroup(), new NioEventLoopGroup())
                // 指定要使用的 Channel 实现
                .channel(NioServerSocketChannel.class)
                // 设置用于处理已被接受的 子 Channel 的 I/O 和数据的ChannelInboundHandler
                .childHandler(
                        new SimpleChannelInboundHandler<ByteBuf>() {
                            ChannelFuture connFuture;

                            @Override
                            public void channelActive(ChannelHandlerContext ctx) throws Exception {
                                // 创建一个 Bootstrap 类的实例以连接到远程主机
                                Bootstrap bootstrap = new Bootstrap();
                                // 指定 Channel 的实现
                                bootstrap.channel(NioSocketChannel.class)
                                        // 为入站 I/O 设置 ChannelInboundHandler
                                        .handler(
                                                new SimpleChannelInboundHandler<ByteBuf>() {
                                                    @Override
                                                    protected void channelRead0(ChannelHandlerContext ctx, ByteBuf in) throws Exception {
                                                        System.out.println("Received data");
                                                    }
                                                });
                                // 使用与分配给已被接受的子Channel相同的EventLoop
                                bootstrap.group(ctx.channel().eventLoop());
                                // 连接到远程节点
                                connFuture = bootstrap.connect(new InetSocketAddress("www.manning.com", 80));
                            }

                            @Override
                            protected void channelRead0(ChannelHandlerContext channelHandlerContext, ByteBuf byteBuf) throws Exception {
                                if (connFuture.isDone()) {
                                    // 当连接完成时,执行一些数据操作(如代理)
                                    // do something with the data
                                    System.out.println();
                                }
                            }
                        });
        // 通过配置好的ServerBootstrap绑定该 ServerSocketChannel
        ChannelFuture future = serverBootstrap.bind(new InetSocketAddress(8080));
        future.addListener(new ChannelFutureListener() {
            @Override
            public void operationComplete(ChannelFuture channelFuture) throws Exception {
                if (channelFuture.isSuccess()) {
                    System.out.println("Server bound");
                } else {
                    System.err.println("Bind attempt failed");
                    channelFuture.cause().printStackTrace();
                }
            }
        });
    }
}

这一节中所讨论的主题以及所提出的解决方案都反映了编写 Netty 应用程序的一个一般准则:尽可能复用 EventLoop,以减少线程创建所带来的开销。

5 在引导过程中添加多个 ChannelHandler

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

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

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

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

评论
登录后参与评论
暂无评论
推荐阅读
[开发日志] Windows 剪贴板记录工具
正是基于这两点思考,我开发了Clipboard Recorder工具。它不仅能帮助用户直观地了解剪贴板的安全风险,也提供了完整的历史记录查询功能。
阿尔的代码屋
2025/01/02
1340
[开发日志] Windows 剪贴板记录工具
效率提升 ! Windows下的多剪贴板管理工具
今天要介绍的开源项目是Ditto。简单来说Ditto就是一个多剪切板的管理工具。Ditto 是 Windows 剪贴板的扩展。您将内容复制到剪贴板,然后 Ditto 会将您复制的内容存储在数据库中,以便以后检索。
huolong
2024/12/25
4640
效率提升 ! Windows下的多剪贴板管理工具
Slackor:Go语言写的一款C&C服务器
这将执行InvokeWebRequest(PS v.3 +)以下载payload,使用LOLBin执行它
FB客服
2019/09/17
1.9K0
Slackor:Go语言写的一款C&C服务器
MontysThree工业间谍软件分析
2020年夏季发现了针对性较强的工业间谍软件的活动,工具集中包含未知的C++模块。恶意软件作者将工具集命名为“ MT3”,研究人员将工具集命名为“ MontysThree”。
FB客服
2020/11/16
1.1K0
MontysThree工业间谍软件分析
Nimbo-C2:一款功能强大的轻量级C2 框架
Nimbo-C2是一款功能强大的轻量级C2 框架,Nimbo-C2代理支持x64 Windows&Linux操作系统。该工具基于Nim和Python开发,其WIndows端使用了.NET组件。Nim的功能非常强大,但在跟Windows系统交互时使用PowerShell可能会更加简单,因此该工具的部分功能是基于PowerShell实现的。Nimbo-C2的Linux代理更加的精简,只能执行基本命令,其中包括ELF加载(通过memfd技术实现)等。
FB客服
2023/08/08
7920
Nimbo-C2:一款功能强大的轻量级C2 框架
PSAsyncShell:一款功能强大的PowerShell异步TCP反向Shell
PSAsyncShell是一款功能强大的PowerShell异步TCP反向Shell,该工具基于纯PowerShell开发,适用于安装并配置了PowerShell环境的设备使用。和其他反向Shell工具不同的是,该工具所实现的所有通信和执行流都是异步完成的,并实现了一些针对防火墙绕过和远程连接处理对策。
FB客服
2022/11/14
6730
PSAsyncShell:一款功能强大的PowerShell异步TCP反向Shell
6款免费网络延迟测试工具
作为网络管理员或网络工程师,时刻关注网络的交付速度至关重要。不仅需要确保自己有良好的响应时间,还需要确保网络的速度足以满足用户通信所需的每一条路径。而手动测试每个路径将占用你所有的时间。所以需要获得一个测试工具,以确保延迟不会影响网络的性能。
释然IT杂谈
2022/08/23
4.9K0
6款免费网络延迟测试工具
PyRexecd:一款专为Windows设计的独立SSH服务器
 关于PyRexecd  PyRexecd是一款专为Windows设计的独立SSH服务器,在该工具的帮助下,广大研究人员可以轻松搭建和使用SSH服务器。  功能介绍  1、独立的Win32应用程序,而非服务,支持常驻系统托盘; 2、支持独立用户/公钥身份验证; 3、支持通过弹窗提醒传入的连接; 4、支持通过STDIN/STDOUT发送和接收剪贴板文字内容;  工具要求  Python 3 Paramiko PyWin32 cx_Freeze(可选)  工具安装  由于该工具基于Python 3开
FB客服
2023/05/19
7850
PyRexecd:一款专为Windows设计的独立SSH服务器
免费的跨平台剪贴板工具,超好用!
在日常的工作中,我们会频繁地使用复制和粘贴功能来处理各种信息。不知道你是不是也遇到过和了不起一样的烦恼:在处理多个任务时,需要来回切换窗口以找到之前复制的内容。这时,一款高效的剪贴板管理工具就显得尤为重要。
永恒君
2024/09/18
5000
免费的跨平台剪贴板工具,超好用!
Windows 10内部的23个隐藏技巧
微软的Windows操作系统不是一回事。它是在其他功能之上构建的功能交织在一起的拼凑而成的功能,这些功能可以追溯到经过时间考验的操作系统的开始。
云深无际
2021/04/14
4.7K0
Windows 10内部的23个隐藏技巧
微信发布一款桌面 AI 效率工具:小微助手,支持智能化搜索、微信翻译、AI 大模型接入等
微信发布一款桌面工作效率的 AI 工具:小微助手,小微助手提供了灵活的搜索输入方式和广泛的搜索对象支持,使用户能够高效地找到所需信息或功能。
iMike
2024/04/30
8920
微信发布一款桌面 AI 效率工具:小微助手,支持智能化搜索、微信翻译、AI 大模型接入等
Invoke-PSObfuscation:一款功能强大的PowerShell Payload代码混淆工具
 关于Invoke-PSObfuscation  Invoke-PSObfuscation是一款功能强大的PowerShell Payload代码混淆工具,在该工具的帮助下,广大研究人员可以轻松对PowerShell Payload中的各个组件以及各部分代码进行混淆处理,以测试安全防护产品的检测性能。 传统的混淆技术倾向于通过添加代码/编码层来封装标准代码,例如base64或压缩等。这种技术所处理的Payload从某种程度上来说也能取得不错的效果,但在提取预期Payload时又往往会出各种问题,而且也容易被
FB客服
2023/04/26
8300
Invoke-PSObfuscation:一款功能强大的PowerShell Payload代码混淆工具
一篇文章精通PowerShell Empire 2.3(下)
Empire主要用于后渗透。所以信息收集是比较常用的一个模块,我们可以使用searchmodule命令搜索需要使用的模块,这里通过键入“usemodule collection”然后按Tab键来查看完整列表,如下图所示。
HACK学习
2019/08/07
1K0
Linux+Windows命令行终端下载指令大全
0x01 Linux 2.1 Wget 这款工具功能很丰富,可以充当某种功能完备的GUI下载管理器,它拥有一款理想的下载管理器所需要的所有功能,比如它可以恢复下载,可以下载多个文件,出现某个连接问题后,可以重新尝试下载,你甚至可以管理最大的下载带宽。 直接下载: wget http://www.sample-videos.com/video/mp4/big.mp4 后台下载: wget -b http://www.sample-videos.com/video/mp4/big.mp4 如果互联网连接出现
入门笔记
2022/06/02
2.6K0
Linux+Windows命令行终端下载指令大全
RDPY:一款功能强大的RDP远程桌面协议实现工具
 关于RDPY  RDPY是一款功能强大的RDP远程桌面协议实现工具,该工具基于纯Python开发,并提供了完整的客户端和服务器端应用程序。 RDPY基于事件驱动的网络引擎Twisted构建,RDPY支持标准RDP安全层、RDP over SSL和NLA认证(通过ntlmv2认证协议)。 RDPY提供了下列RDP和VNC代码: 1、RDP中间人代理(用于记录会话); 2、RDP蜜罐; 3、RDP截图工具; 4、RDP客户端; 5、VNC客户端; 6、VNC截图工具; 7、RSS Pl
FB客服
2023/03/29
4K0
RDPY:一款功能强大的RDP远程桌面协议实现工具
神话传奇:一款通过卖号在微信群传播的远控木马
近期,360安全卫士监测到了一批通过微信群传播的远控木马,木马针对在网上倒卖微信号的人群定向投放。卖号人的交流群里时常有不同的小号在散播诱导性的木马程序,不知情的卖号人运行木马后,电脑上就被植入后门。
FB客服
2018/07/30
1.5K0
神话传奇:一款通过卖号在微信群传播的远控木马
Get-AppLockerEventlog:一款功能强大的AppLocker事件日志提取工具
 关于Get-AppLockerEventlog  Get-AppLockerEventlog是一款功能强大的Applocker事件日志提取工具,该脚本能够从Windows事件日志中解析所有的事件,并从中提取出与AppLocker相关的所有日志。 该脚本可以帮助广大研究人员收集与事件相关的所有重要信息,而这些信息随后可以应用到信息安全取证、威胁搜索和故障排除等场景。 当前版本的Get-AppLockerEventlog支持提取下列日志信息: EXE DLL MSI 脚本 封装的App部署 封装的App执行
FB客服
2023/03/29
3170
Get-AppLockerEventlog:一款功能强大的AppLocker事件日志提取工具
FreeBuf__PowerShell Empire实战入门篇
前言 PowerShsell Empire中文简称 “帝国” ,可能大多数只听说过这款内网渗透神器,针对windows系统平台而打造的一款渗透工具。在PowerShell方面,帝国实现了无需powershell.exe即可运行PowerShell代理的功能,可快速部署的开发后的模块从按键记录到Mimikatz,可逃避网络检测的能力,适应性强的通信,都包裹在易用性为重点的框架,有点类似于像meterpreter。 Empire详情介绍参考官方网站:http://powershellempire.
奶糖味的代言
2018/04/16
2.1K0
FreeBuf__PowerShell Empire实战入门篇
Chrome开发者工具的11个高级使用技巧
本文作者从开发者角度出发,介绍了几个关于 Chrome 开发者工具的高级用法。熟练使用这些高级用法可以大大地提高你的生产力。
深度学习与Python
2020/08/28
2.5K0
信息窃密木马入局新玩家:ExelaStealer
2023 年,信息窃密木马纷纷涌现,既有 RedLine、Raccoon 和 Vidar 等这个市场中的重要玩家,也有 SaphireStealer 等刚入局的新玩家。近日,研究人员发现了新的信息窃密木马:ExelaStealer。ExelaStealer 最早在 2023 年 8 月被披露。
FB客服
2023/11/16
2360
信息窃密木马入局新玩家:ExelaStealer
推荐阅读
相关推荐
[开发日志] Windows 剪贴板记录工具
更多 >
LV.1
这个人很懒,什么都没有留下~
目录
  • 0 定义
  • 1 Bootstrap 类
    • 1.1 为何引导类是 Cloneable
  • 2 引导客户端和无连接协议
    • 2.1 引导客户端
    • 2.2 Channel 和 EventLoopGroup 的兼容性
      • IllegalStateException
  • 3 引导服务器
    • 3.1 ServerBootstrap 类
    • 3.2 引导服务器
  • 4 从 Channel 引导客户端
    • 更好的解决方案
  • 5 在引导过程中添加多个 ChannelHandler
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档