IO网络编程(四)

Netty 各组件的原理分析(九) Channel、EventLoop(Group)和 ChannelFuture Netty 网络抽象的代表: Channel—Socket; EventLoop—控制流、多线程处理、并发; ChannelFuture—异步通知。 Channel 和 EventLoop 关系如图: Channel 接口 基本的 I/O 操作(bind()、connect()、read()和 write())依赖于底层网络传输所提供的原 语。在基于 Java 的网络编程中,其基本的.. 阅读详情

netty客户端的创建(简单入门)

netty客户端创建时序图

步骤 1:用户线程创建 Bootstrap实例,通过 API设置创建客户端相关的参数,异步发起客户端连接。
步骤 2: 创 建 处 理 客 户 端 连 接、I/O 读 写 的 Reactor 线 程 组NioEventLoopGroup, 可以通过构造函数指定 I/O 线程的个数,默认为 CPU内核数的 2 倍;
步骤 3:通过 Bootstrap 的 ChannelFactory 和用户指定的 Channel 类型创建用于客户端连接的 NioSocketChannel,它的功能类似于 JDK NIO 类库提供的SocketChannel;
步骤 4:创建默认的 Channel Handler Pipeline,用于调度和执行网络事件;
步骤 5:异步发起 TCP 连接,判断连接是否成功,如果成功,则直接将NioSocketChannel 注册到多路复用器上,监听读操作位,用于数据报读取消
息发送;如果没有立即连接成功,则注册连接监听位到多路复用器,等待连接结果;
步骤 6:注册对应的网络监听状态位到多路复用器;
步骤 7:由多路复用器在 I/O 现场中轮询各 Channel,处理连接结果;
步骤 8:如果连接成功,设置 Future 结果,发送连接成功事件,触发ChannelPipeline 执行;
步骤 9:由 ChannelPipeline 调度执行系统和用户的 ChannelHandler,执行业务逻辑。
在这里插入图片描述

编写 Echo 客户端

Echo 客户端将会:
(1)连接到服务器;
(2)发送一个或者多个消息;
(3)对于每个消息,等待并接收从服务器发回的相同的消息;
(4)关闭连接。
编写客户端所涉及的两个主要代码部分也是业务逻辑和引导,和你在服务器中看到的一样。
1.ChannelHandler 和业务逻辑
客户端将拥有一个用来处理数据的 ChannelInboundHandler。在这个场景
下,将扩展 SimpleChannelInboundHandler 类以处理所有必须的任务,要求重写下面的方法:
 channelActive()——在到服务器的连接已经建立之后将被调用;
channelRead0()——当从服务器接收到一条消息时被调用;
 exceptionCaught()——在处理过程中引发异常时被调用;
客户端的 ChannelHandler的代码如下:

public class EchoClientHandler extends SimpleChannelInboundHandler<ByteBuf> {
    @Override
    protected void channelRead0(ChannelHandlerContext ctx, ByteBuf in) throws Exception {

        System.out.println("Client received " + in.toString(CharsetUtil.UTF_8));
    }

    @Override
    public void channelActive(ChannelHandlerContext ctx) throws Exception {
        ctx.writeAndFlush(Unpooled.copiedBuffer("Netty Rocks!", CharsetUtil.UTF_8));

    }

    @Override
    public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) throws Exception {
        cause.printStackTrace();
        ctx.close();
    }
}

首先,重写了 channelActive()方法,其将在一个连接建立时被调用。这确保了数据将会被尽可能快地写入服务器,其在这个场景下是一个编码了字符串"Netty rocks!"的字节缓冲区。
接下来,重写了 channelRead0()方法。每当接收数据时,都会调用这个方法。需要注意的是,由服务器发送的消息可能会被分块接收。也就是说,如果服务器发送了 5 字节,那么不能保证这 5 字节会被一次性接收。即使是对于这么少量的数据,channelRead0()方法也可能会被调用两次,第一次使用一个持有 3 字节的 ByteBuf(Netty 的字节容器),第二次使用一个持有 2 字节的 ByteBuf。作为一个面向流的协议,TCP 保证了字节数组将会按照服务器发送它们的顺序被接收。
重写的第三个方法是 exceptionCaught()。如同在 EchoServerHandler中所示,记录 Throwable,关闭 Channel,在这个场景下,终止到服务器的连接。
2.引导客户端
引导客户端类似于引导服务器,不同的是,客户端是使用主机和端口参数来连接远程地址,也就是这里的 Echo 服务器的地址,而不是绑定到一个一直
被监听的端口。

public class EchoClient {
    private final String host;
    private final int port;

    public EchoClient(String host, int port) {
        this.host = host;
        this.port = port;
    }

    public void start() throws InterruptedException {
        EventLoopGroup  group = new NioEventLoopGroup();
        Bootstrap b = new Bootstrap();
        b.group(group).channel(NioSocketChannel.class).remoteAddress(new InetSocketAddress(host,port))
                .handler(new ChannelInitializer<SocketChannel>() {
                    @Override
                    protected void initChannel(SocketChannel ch) throws Exception {
                        ch.pipeline().addLast(new EchoClientHandler());
                    }
                });
        ChannelFuture f = b.connect().sync();
        f.channel().closeFuture().sync();
        group.shutdownGracefully().sync();


    }

    public static void main(String[] args) throws InterruptedException {
        String host = "localhost";
        int port = 9999;
        new EchoClient(host,port).start();
    }
}

这一节中所介绍的要点:
 为初始化客户端,创建了一个 Bootstrap 实例;
 为进行事件处理分配了一个 NioEventLoopGroup 实例,其中事件处理包括创建新的连接以及处理入站和出站数据;  为服务器连接创建了一个 InetSocketAddress 实例;
 当连接被建立时,一个 EchoClientHandler 实例会被安装到(该 Channel 的)ChannelPipeline 中;
 在一切都设置完成后,调用Bootstrap.connect()方法连接到远程节点;

至此完成了服务端和客户端的创建可以运行调试了,按照服务端和客户端的顺序依次运行程序:

每次运行客户端时,在服务器的控制台中你都能看到这条日志语句。

Server received Netty Rocks!

下面是发生的事:
(1)一旦客户端建立连接,它就发送它的消息——Netty rocks!;
(2)服务器报告接收到的消息,并将其回送给客户端;
(3)客户端报告返回的消息并退出。

C++和OpenGL实现3D游戏编程【连载6】——不规则图形的纹理贴图(附源码) 上一节我们讨论了纹理贴图的相关基础操作,但上一节的纹理贴图操作基本上都是规则图形,包括圆形和球形虽然复杂一点,但是它也是规则的。这一节课我们要讨论一下,怎么在不规则图形上纹理贴图,就比如文章下图的心形纹理贴图,以及纹理的平移、旋转、放大缩小功能。 阅读详情

相关推荐

算法竞赛入门到进阶 --- 完整学习路线(含知识点讲解)

前言: 咳咳,接触算法竞赛也有一年了,却从来都没有进行过一次系统的学习,稀里糊涂的就这么搞了半年,如今,我决定认认真真的进行一次系统的复盘。嗯嗯,先把大体路线列出来,然后往后每天搞几篇,可能大三能完成,可能永远也不能写完这些,我只能慢慢来,一起共勉吧。冲了!(主要是太菜了,不系统学习下,怕是铜牌都拿不到呀!) 算法竞赛入门到进阶一、sort函数自定义排序二、c++容器的使用1.vector动态数组2.stack栈3.queue队列4.list链表5.set集合6.map映射三、二进制子集生成四、bfs.

qq_43514659的博客 2万+

【Netty专题】Netty 中channelRead 和 channelRead0 有什么区别?

最近做项目发现Netty中的channel有channelRead 方法也有channelRead0 方法, 然后思考下这两个有什么区别呢? 我们来直接看源码 channelRead @Override public void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception { boolean release = true; try { if (acce.

Coinker的博客 1万+

10X Genomics数据实战:手把手教你用Seurat处理单细胞PBMC数据(附完整代码)

本文详细介绍了如何使用Seurat处理10X Genomics的单细胞PBMC数据,从数据获取、质控到降维分析和细胞分群的全流程。通过实战代码演示,帮助研究者掌握单细胞RNA测序数据分析的核心技术,提升对细胞异质性的理解。

weixin_29053577的博客 252

netty中的channelRead()与channelRead0()区别

而writeAndFlush()源码中的write()方法是异步执行的,若其正在处理 msg,而此时 SimpleChannelInboundHandler 中的 channelRead()方法执行完毕了,则会将 msg 给释放了。:在netty的api使用中,一般我们自定义处理器类的时候,会继承ChannelInboundHandlerAdapter或者SimpleChannelInboundHandler。而我们在重写channelRead0()方法的时候,有时场景需要处理接收的信息并发回给对端。

weixin_42037190的博客 4642

基于Multisim的模电调幅发射机仿真设计

振荡器产生的高频信号的功率很小,所以有必要对高频信号进行功率放大,有利于信号的调制发射。缓冲电路将主振荡器和高频功放电路相隔离,以减小功放电路对主振荡器的影响。缓冲电路可以用射极跟随器电路来实现,其作用就是前后级的阻抗相互匹配,减小前后级的影响。总电路的仿真结果见下图:示波器1~4分别是主振荡器、缓冲电路、高频放大电路和调幅电路的输出波形。由于载波频率稳定度≤10-3,所以可以采用并联型改进电容反馈式三端振荡器(Seiler电路)谐振回路,滤除其他频率的成分,得到与载波(假设。(1)缓冲电路的设计与实现。

Eve223322的博客 4571

VUE3如何使得大屏自适应的几种方法?

16:9。

weixin_42711805的博客 1万+

SimpleChannelInboundHandler——channelRead0

1. ChannelInboundHandlerAdapter与SimpleChannelInboundHandler的简介 在netty4.0.X版本中,ChannelInboundHandlerAdapter是普通类,而SimpleChannelInboundHandler<T>是抽象类。 SimpleChannelInboundHandler<T>有一个重要特性,就是消息被读取后,会自动释放资源,常见的IM聊天软件的机制就类似这种。 绝大部分场景都可以用Channe...

xhuiting的博客 5869

【C++】开源:cpp-httplib HTTP协议库配置与使用

cpp-httplib HTTP协议库配置与使用

DevFrank的博客 5540

Netty 中channelRead 和 channelRead0 有什么区别?

channelRead 中调用了 channelRead0,其会先做消息类型检查,判断当前message 是否需要传递到下一个。最近做项目发现Netty中的channel有channelRead 方法也有channelRead0 方法,然后思考下这两个有什么区别呢?

刀林寻诗 1689

天猫精灵设备拆机及系统分析

我手头的这个天猫精灵型号为TG_X1,黑色天猫精灵AI助手,拆解没有多少难度,但需要注意连接线的问题。具体的拆机过程可以参见:http://www.geekifix.com/wp/archives/415.html注意一点就是,天猫精灵的主板的位置,位于音频按键的底部,也就是顶端,而拆解是从电源的位置从低到顶进行拆机;拆机后,看到主控板的信息如下:主控型号:联发科 MT8516MT8516支持四核...

LeeKwen的专栏 3万+

YOLOv11 改进 - 特征融合 | 小目标检测救星:DySample动态上采样减少特征丢失

本文介绍了超轻量且高效的动态上采样器DySample与YOLOv11的结合,以解决传统上采样器工作负载大、应用场景受限的问题。DySample从点采样角度构建上采样,绕过动态卷积,使用PyTorch标准内置函数实现,无需定制CUDA包,能大幅减少参数、FLOPs等资源消耗。我们将DySample代码集成进YOLOv11。实验脚本显示,结合DySample的YOLOv11在多个密集预测任务中或表现出色。

魔改工程师的博客 1414

网络编程知识四之IO模型 设置获取socket属性

一.I/O模型讲解 1)阻塞(block)IO : 当资源不满足条件。 此时进程阻塞。进程休眠,不会浪费CPU。最简单效率低。并且进程最终会阻塞在其中一个阻塞函数上,而其它的函数没法及时调用。 常见的阻塞I/O:read / write fgets/scanf send/recv accept 2)非阻塞的方式调用(noblock) 问题:需要不断轮询每个函数,浪费cpu资源 。若是没有数据,则让进程立即返回错误。 错误码如下: 普通文件描述符 EAGAIN 套接字

Danny_llp的博客 791

RK3399平台开发系列讲解(外设篇)交换芯片RTL8306M

网络:交换芯片RTL8306M 电路: make menuconfig 配置: 目录:arch/arm64/configs/rk3399_b201_defconfig CONFIG_FIXED_PHY=y 设备树: arch/arm64/boot/dts/rockchip/rk3399-b201-rev1.dts 时钟: Open之后首先校验网卡mac地址是否正确(stmmac_chec...

内核笔记 2390

c++应用网络编程之四Linux常用的网络IO模型

实事求是,与时俱进,理论联系实际,实践是检验真理的唯一标准…,这些理论每个人可能都会脱口而出。但真正的应用环节呢?可能绝大多数人会有意无意的找各种借口,陈陈相因,因循守旧,更别提创新意识了。只有在实践中深入分析掌握了现有技术的优劣,才可能知晓应用场景下的各种技术不足,才可能产生创新意识。网络编程中这种例子特别多(如io_uring,dpdk),毕竟实际应用的在不断提高对网络技术的要求。而更可怕的是,这种要求不但没有降低还在不断的提高。

fpcc的专栏 898

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

Outlook Express 6 (OE6) for Win7/Win8/Win10

英文版 Outlook Express6.0, 兼容Win7/Win10/WinXP,解压就可用。

网络编程相关概念

网络编程相关概念 最近在看Tomcat源码,涉及到网络编程模型,所以将这块的知识点进行一个归纳整理。 网络 网络是由若干节点(计算机)和连接这些节点的链路构成,表示诸多对象及其相互联系。 网络特性 1、资源共享 网络的主要功能就是资源共享。共享的资源包括软件资源、硬件资源以及存储在公共数据库中的各类数据资源。网上用户能部分或全部地共享这些资源,使网络中的资源能够互通有无、分工协作,从而大大提高系统资源的利用率。 2、快速传输信息 分布在不同地区的计算机系统,可以通过网络及时、高速地传递各种信息,交

北漂码农有话说 1863

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

Java基础(四)——泛型、IO流、网络编程

Java基础第13章 泛型13.1 泛型的概述13.2 形式一:泛型类与泛型接口13.3 形式二:泛型方法13.4 通配符?13.5 Collections工具类第14章 IO流14.1 java.io.File类14.2 IO流的四大抽象基类14.3 文件IO流14.4 缓冲IO流14.5 编码与解码的IO流(转换流)14.6 数据IO流14.7 对象IO流14.8 其他的IO流相关内容14.9 JDK1.7之后引入新try..catch第十五章 网络编程15.1 主机IP15.2 端口号15.3 网络

波仔头的博客 483

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

Linux网络编程(四)——学习历程 多路IO之epoll

如果内存1G,epoll就支持10w连接I/O多路转接函数。

C_J_L12580的博客 335

unix网络编程笔记(四)--IO复用

unix网络编程笔记(四)--IO复用

sunny_ss12的专栏 3830

网络编程(四)——io多路复用(select)

系统调用:文件io无缓冲区效率低可以操作硬件标准io:有缓冲区效率高不允许直接操作硬件。

qq_59566583的博客 262

【C++网络编程】(四)IO多路复用:select

此外,CPU在进行线程之间的上下文切换时也会有一定的开销,这进一步增加了系统的负担。在Linux系统中,一切皆文件,每个客户端连接都是以一个文件描述符(File Descriptor,FD)表示。复用指的是允许同一个线程处理多个IO操作,避免了为每个IO操作创建独立线程,从而实现了资源的复用。此外,使用非阻塞套接字避免了阻塞带来的问题,但会导致 CPU 占用高、编程复杂度增加、错误处理变得更复杂,以及可能出现数据传输不完整的情况。调用 select 时,将这个位图传递给内核,以判断哪些文件描述符是就绪的。

weixin_44378835的博客 817

Boost.Asio C++ 网络编程之四:io_service类

引言 文章的内容是翻译 《Boost.Asio C++ Network Programming》这本书。 编译IDE环境是 vs2017 https://blog.youkuaiyun.com/caoshangpa/article/details/79233059 io_service类 你应该已经发现大部分使用Boost.Asio编写的代码都会使用几个io_service的实例。 io_service是...

Osean_li的博客 429

基于boost库C++网络编程(四):IO 层与业务逻辑层解耦

本文摘要: 服务器设计采用异步IO与业务逻辑分离架构,核心优化包括:1)消息头升级为结构化格式(ID+长度+内容),配合JSON序列化实现业务解耦;2)通过LogicSystem单例实现生产者-消费者模型,分离IO线程与业务线程;3)基于消息ID注册回调机制,支持插件化扩展业务逻辑;4)采用mutex+条件变量保证线程安全,支持消息有序处理;5)实现优雅退出机制,包括信号捕获、资源清理和线程安全终止。该设计遵循职责单一原则,具有高并发、易扩展和安全可靠的特点。

2403_87381789的博客 832

【网络编程(四)】IO多路复用(2)

上一节讲了select , poll。 但是现代的linux系统对于多路富用采用的更多为epoll函数。 epoll比前两个函数更加好用,下面给出具体用法。 void server6(){ const uint16_t listened_port=9000; const char* localhost="127.0.0.1"; const int listening...

六六先森的博客 224

孤舟笔记 IO 与网络编程篇四 IO多路复用到底是什么?select/poll/epoll一篇搞懂

IO多路复用是高并发网络编程的核心技术,通过一个线程监听多个IO事件,避免了一连接一线程的资源浪费。本文系统讲解了select、poll、epoll三种实现方式的演进:select存在1024连接限制和O(n)遍历问题;poll解除了数量限制但性能未提升;epoll通过红黑树注册、就绪链表和回调机制实现了O(1)注册和O(k)返回的高效处理。文章还对比了水平触发和边缘触发模式,指出Java NIO在不同系统上的底层实现差异(Linux用epoll,macOS用kqueue)。最后提供了标准回答框架和加分知识

学无止境 (专注java,爱好前端) 593

Skr-Eric的网络编程课堂(四)-- http请求和响应及IO分类

tcp应用之http传输 http协议 : 超文本传输协议,是一个应用层协议 用途 : 网页数据的传输 数据传输方法 特点 : 1. 应用层协议,传输层使用tcp服务 2. 简单,灵活,多种语言都有http相关操作接口 3. 无状态的协议,即不记录用户传输的信息 4. http1.1 支持持久连接 一端通过http请求的格式发送具体请求内容,另一端接...

Skr_Eric的博客 671

alin的学习之路(Linux网络编程:四)(多路IO转接:select、poll、epoll)

alin的学习之路(Linux网络编程:四)(多路IO转接:select、poll、epoll) 1. select 1. select优化思路 当select转接的文件描述符跨度过大时,每次都遍历文件描述符表显然会降低效率,因此要对其优化。 优化思路:添加一个数组来存储要监听的文件描述符,直接遍历这个数组即可 程序流程: 创建监听套接字lfd = Socket() 设置端口复用 setsockopt() Bind() 绑定ip和端口号 Listen()设置最大监听个数 定义fd_set rset,all

alin的博客 435
上一篇: IO网络编程(三)
下一篇: Oracle数据库order by查询问题
CodersCoder
博客等级 码龄10年 90粉丝 258原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值