Netty(3)-实现客户端与服务端的双向通信

基于Netty实现UDP双向通信 1、Channel继承关系 关于ChannelPipeline原理可参考:https://blog.youkuaiyun.com/qq_21033663/article/details/105674261 2、NIO Channel分类 1)NioDatagramChannel:发送和接收数据包,支持TCP和UDP,对DatagramSocket和selector进行封装 2)NioServerSocketChannel:服务端使用,对JDK的ServerSocketChannel进行了封装 3)NioSocketC 阅读详情

一.基本思路

读写逻辑处理均是启动阶段通过给逻辑处理链Pipeline添加逻辑处理器实现连接数据的读写逻辑。

  1. 客户端连接成功回调逻辑处理器的channelActive()方法

  2. 客户端和服务端接收到对方的数据回调用各自逻辑处理器的channelRead()方法。

  3. 客户端和服务端向对方写数据调用writeAndFlush()方法

  4. 客户端和服务端交互的二进制数据传输载体为ByteBuf

二.通信流程

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-lxx6KkVY-1580725870430)(http://note.youdao.com/yws/res/9840/76DC2AB9464A4D1882346E496B1C9518)]

三.代码实现

  • NIOServer
/**
 * @Auther: ARong
 * @Description: 服务端-客户端双向通信,服务端在接收到客户端信息后向客户端发出响应
 */
public class NIOServer {
    public static void main(String[] args) {
        ServerBootstrap serverBootstrap = new ServerBootstrap();
        NioEventLoopGroup bossGroup = new NioEventLoopGroup(); // 监听组
        NioEventLoopGroup workerGroup = new NioEventLoopGroup(); // 工作组

        serverBootstrap.group(bossGroup, workerGroup)
                .channel(NioServerSocketChannel.class) //NIO模式
                .childHandler(new ChannelInitializer<SocketChannel>() {
                    @Override
                    // 初始化channel
                    protected void initChannel(SocketChannel ch) throws Exception {
                        ch.pipeline().addLast(new FirstServerHandler());
                    }
                }).bind(8000);
    }
}

  • NIOClient
/**
 * @Auther: ARong
 * @Description: 服务端-客户端双向通信,客户端向服务端发送信息
 */
public class NIOClient {
    public static void main(String[] args) throws InterruptedException {
        Bootstrap bootstrap = new Bootstrap();
        NioEventLoopGroup group = new NioEventLoopGroup();

        bootstrap.group(group).channel(NioSocketChannel.class).handler(new ChannelInitializer<SocketChannel>() {
            @Override
            protected void initChannel(SocketChannel ch) throws Exception {
                // 责任链模式,添加第一次连接的客户端处理逻辑
                ch.pipeline().addLast(new FirstClientHandler());
            }
        });

        Channel channel = bootstrap.connect("127.0.0.1", 8000).channel();
        String message = String.format("HelloWorld From %s", new SimpleDateFormat("hh:mm:ss").format(new Date()));
        channel.writeAndFlush(message);
    }
}
  • FirstServerHandler
/**
 * @Auther: ARong
 * @Description: 服务端被首次连接的处理逻辑
 */
public class FirstServerHandler extends ChannelInboundHandlerAdapter {
    @Override
    /*
     * @Author ARong
     * @Description 接收到服务端消息时触发
     * @Param [ctx, msg]
     * @return void
     **/
    public void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception {
        ByteBuf byteBuf = (ByteBuf) msg;
        System.out.println(String.format("服务端读取到数据%s From %s",
                byteBuf.toString(Charset.forName("utf-8")),
                getCurTime()));

        ByteBuf byteBuf1 = getByteBuf(ctx);
        ctx.channel().writeAndFlush(byteBuf1);
    }

    /*
     * @Author ARong
     * @Description 获取二进制抽象 ByteBuf
     * @Param [ctx]
     * @return io.netty.buffer.ByteBuf
     **/
    private ByteBuf getByteBuf(ChannelHandlerContext ctx) {
        // 获取二进制抽象 ByteBuf
        ByteBuf buffer = ctx.alloc().buffer();

        // 准备数据,指定字符串的字符集为 utf-8
        String response = String.format("服务端返回HelloWorld From %s", getCurTime());
        byte[] bytes = response.getBytes(Charset.forName("utf-8"));

        // 填充数据到 ByteBuf
        buffer.writeBytes(bytes);

        return buffer;
    }

    private String getCurTime() {
        return new SimpleDateFormat("hh:mm:ss").format(new Date());
    }
}
  • FirstClientHandler
/**
 * @Auther: ARong
 * @Description: 首次连接的客户端处理逻辑
 */
public class FirstClientHandler extends ChannelInboundHandlerAdapter {
    @Override
    /*
     * @Author ARong
     * @Description 客户端与服务端首次连接的处理逻辑
     * @Param [ctx]
     * @return void
     **/
    public void channelActive(ChannelHandlerContext ctx) throws Exception {
        // 编码数据
        ByteBuf byteBuf = getByteBuf(ctx);
        // 写回给服务端
        ctx.channel().writeAndFlush(byteBuf);
    }

    @Override
    /*
     * @Author ARong
     * @Description 接收到服务端消息时触发
     * @Param [ctx, msg]
     * @return void
     **/
    public void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception {
        ByteBuf byteBuf = (ByteBuf) msg;
        System.out.println(String.format("客户端读取到数据%s From %s",
                byteBuf.toString(Charset.forName("utf-8")),
                getCurTime()));
    }

    /*
     * @Author ARong
     * @Description 获取二进制抽象 ByteBuf
     * @Param [ctx]
     * @return io.netty.buffer.ByteBuf
     **/
    private ByteBuf getByteBuf(ChannelHandlerContext ctx) {
        // 获取二进制抽象 ByteBuf
        ByteBuf buffer = ctx.alloc().buffer();

        // 准备数据,指定字符串的字符集为 utf-8
        String response = String.format("客户端返回HelloWorld From %s", getCurTime());
        byte[] bytes = response.getBytes(Charset.forName("utf-8"));

        // 填充数据到 ByteBuf
        buffer.writeBytes(bytes);

        return buffer;
    }

    private String getCurTime() {
        return new SimpleDateFormat("hh:mm:ss").format(new Date());
    }
}

依次启动客户端和服务端,实现双向通信:

在这里插入图片描述

Netty实战 IM即时通讯系统(十)实现客户端和服务端收发消息 Netty实战 IM即时通讯系统(十)实现客户端和服务端收发消息 零、 目录 IM系统简介 Netty 简介 Netty 环境配置 服务端启动流程 客户端启动流程 实战: 客户端和服务端双向通信 数据传输载体ByteBuf介绍 客户端与服务端通信协议编解码 实现客户端登录 实现客户端与服务端收发消息 pipeline与channelHandler 构建客户端与服务端pipeline 拆包粘... 阅读详情

相关推荐

Netty原理分析及实战(四)-客户端与服务端双向通信

本文是Netty原理分析及实战(四)-客户端与服务端双向通信,若要关注前文,请点击传送门: Netty原理分析及实战(三)-高可用服务端搭建 前文Netty服务端搭建。通过Netty搭建的客户端和服务端都能够支持高并发量的连接需求,本文我们来实现一下Netty的客户端。 一、准备工作 需要准备好前文搭建的Netty服务端,环境和服务端相同就可以了。 二、创建Netty客户端(Netty ...

专注基础架构领域 1289

netty实现客户端与服务器基本通信

作用:netty实现客户端与服务端基本通信。

王举 455

Netty使用SSL实现双向通信加密

最近项目有个需求,TCP服务器实现基于证书通信加密,之前没做过,花了一些时间调研,今天整理下。

我是香菜 2109

使用Netty实现客户端和服务端之间的双向通信

在上个月的开发计划中,有一个系统控制喇叭播放的功能。当时就想到了使用netty进行通信操作。于是在调研途中,发现网上写的都是简单案例,不适用于当前的复杂通信模式。比如超时断线,断线重连,通信监听,错误记录存储,以及断线和上线后的钉钉通知等等。所以自己从头到尾重新写了一个完整项目,供大家参考。提示以下是本篇文章正文内容,下面案例可供参考。......

weixin_44030476的博客 4980

Netty实现WebSocket服务端与客户端交互技巧总结

WebSocket是一种在单个TCP连接上进行全双工通信的协议。与传统HTTP轮询不同,WebSocket允许服务器主动向客户端发送消息,大幅提升了实时通信的效率。它通过升级HTTP协议的方式建立长连接,实现了真正的双向通信。

weixin_36364707的博客 1165

netty实现sdtp协议

netty实现sdtp协议,此demo通过netty高性能框架实现对接硬件设备的tcp通讯

Netty 基础-双向通信实例及总结

我最初在认识上有这样的误区,认为只有在 netty,nio 这样的多路复用 IO 模型时,读写才不会相互阻塞,才可以实现高效的双向通信,但实际上,Java Socket 是全双工的:在任意时刻,线路上存在A 到 B 和 B 到 A 的双向信号传输。即使是阻塞 IO,读和写是可以同时进行的,只要分别采用读线程和写线程即可,读不会阻塞写、写也不会阻塞读

秃头的博客 711

同花顺Supermind量化交易 风险控制建模--海龟交易法则

A.市场与标的海龟交易法则应用于流动性高的市场中,选择交易量较大的标的进行交易。本文以沪深300指数ETF为标的,构建海龟交易法则。B、仓位:仓位是海龟交易系统最核心的部分,通过ATR真实波幅指标来管理仓位。第一步:计算True Range,简称TR。TR = Max ( H−L , H−P , P−L ) ,其中H为当日日内最高价,L为当日日内最低价,P为前一日收盘价。第二步:计算ATRATR = mean ( TR , 20 ) , 即计算过去20天的TR的平均值,ATR是TR的移动平均值。

qq_22808537的博客 1497

Netty实现简单的双向通信(聊天)

好了这就是具体的实现了,有什么不对或者可以跟好的地方可以评论指出。

qq_52072614的博客 1608

遥感生态指数(RSEI)——四个指数的计算

遥感生态指数是在4个生态指数的基础上通过主成分变换得出的一个评价生态环境质量的指标。因此,第二部分就是要分别计算出这4个指数的值。 ①首先,是绿度指数的计算,一般用归一化植被指数(NDVI) NDVI=(NIR-Red)/(NIR+Red) 在Bandmath工具中输入NDVI计算公式 (float(b4-b3))/(b4+b3) 其中,b3、b4分别是红波段和近红外波段 ②其次,是湿度计算。 WET = c1B1 + c2B2 + c3B3...

qq_41978498的博客 9万+

Qt CEF融合技QCefView使用教程

如果从事C++客户端开发,对CEF应该不陌生,当C++界面需要和web交互时,CEF是很好的解决方案,当然Qt也提供了QWebEngineView来进行web交互,最近在万兴喵影的安装目录看到了QCefView.dll,之前也听说过这个库,没在意,没想到还真有人用到项目里面,于是决定自己编译写个demo看看......

琅嬛福地 1万+

netty之微信-客户端与服务端双向通信(七)

实战:客户端与服务端双向通信 在前面两个小节,我们已经学习了服务端启动与客户端启动的流程,熟悉了这两个过程之后,就可以建立服务端与客户端之间的通信了,本小节,我们用一个非常简单的 Demo 来了解一下服务端和客户端是如何来通信的。 .handler(new ChannelInitializer&lt;SocketChannel&gt;() { @Override public...

huangpeigui的专栏 1191

【漏洞复现】爱数云盘 Usrm_GetAllUsers 未授权访问漏洞

爱数 AnyShare存在未授权漏洞,未授权的攻击者可以通过该漏洞获取用户名信息。

qq_67810151的博客 3122

Netty初学三 客户端与服务端双向通信

首先获取一个Netty对二进制数的抽象ByteBuf,ctx.alloc()获取一个ByteBuf的内存管理器,然后将二进制数据填充到ByteBuf,最后调用ctx.channel().writeAndFlush()把数据写到服务端。从以上代码中可以看出,Netty里的数据是以ByteBuf为单位的,所需要写的数据必须放在一个ByteBuf中,读数据也如此。ch.pipeline()返回的是和这条连接相关的逻辑处理链,采用的是责任链模式。服务端覆盖的方法是channelRead()方法。

2201_75920541的博客 588

基于 Simulink 的双向 DC/AC 逆变器中 IGBT/MOSFET 寄生参数影响分析实战教程

摘要:本教程详细解析了Simulink中IGBT/MOSFET寄生参数对双向DC/AC逆变器的影响。通过对比理想模型与含寄生参数(如20nH内部电感、50nH回路电感)的仿真,揭示了电压尖峰、高频振荡等实际问题。建模步骤包括搭建基准电路、引入寄生参数、配置高精度求解器(步长10ns),并给出抑制措施:添加RC缓冲电路、调整驱动电阻。关键发现:寄生参数会显著增加开关损耗和EMI噪声,需通过参数扫描优化设计。教程还提供了代数环报错、仿真速度优化等实战技巧,帮助工程师从理想仿真过渡到高保真分析。

xiaoheshang_123的博客 69

[最新]MapReduce综合应用案例 — 气象数据清洗

【代码】[最新]MapReduce综合应用案例 — 气象数据清洗。

M_inherit的博客 1018

服务端基于Netty4的UDP双向通信Demo演示

【前言】 NIO框架的流行,使得开发大并发、高性能的互联网服务端成为可能。这其中最流行的无非就是MINA和Netty了,MINA目前的主要版本是MINA2、而Netty的主要版本是Netty3和Netty4(Netty5已经被取消开发了:详见此文)。 本文将演示的是一个基于Netty4的UDP服务端和一个标准UDP客户端(Java实现)双向通信的完整例子。实际上,Netty4的UDP例

okkeqin的专栏 1万+

【人工智能】架构演进:基于本体论与 LLM Agent 的供应链备件决策闭环实践

本文探讨了如何将本体论(Ontology)与大语言模型(LLM)Agent结合,构建供应链备件管理的智能决策系统。针对LLM在垂直领域存在的幻觉和逻辑缺陷问题,提出通过本体论建立结构化知识框架,形成四层架构:知识建模、动态感知、深度分析和决策闭环。系统利用图数据库实例化领域本体,融合多源数据实现实时感知,结合图谱推理和时序预测进行确定性分析,最终通过工具调用完成决策执行。技术选型推荐Gemini 1.5 Pro、Neo4j和LangChain等工具,实现从自动化到智能化的升级。该架构为工业领域提供了可解释、

奶爸的编程之路,也就一周冷个三天 172

【闪电侠学netty】第6章 客户端与服务端双向通信

客户端与服务端双向通信

ladymorgana的博客 1286

Arcgis建筑面shp由DSM和DEM获取高度拉伸并可视化

Arcgis建筑面shp由DSM和DEM获取高度拉伸并可视化

yilvyangguang520的博客 3997

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

Netty实现双向通信-单向通信

Netty 中实现单向通信的核心是业务层限制数据流向:仅一方发送数据,另一方仅接收(不回复业务数据)。借助 Netty 的异步 IO 和编解码框架,可高效实现高并发的单向数据传输,同时需注意连接维护和资源控制。

weixin_46136610的博客 775

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

Netty入门

【零拷贝】的体现之一,对原始 ByteBuf 进行切片成多个 ByteBuf,切片后的 ByteBuf 并没有发生内存复制,还是使用原始 ByteBuf 的内存,切片后的 ByteBuf 维护独立的 read,write 指针。netty 中的 Future 与 jdk 中的 Future 同名,但是是两个接口,netty 的 Future 继承自 jdk 的 Future,而 Promise 又对 netty Future 进行了扩展。connect 方法是异步的,意味着不等连接建立,方法执行就返回了。

我的博客 1692

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

Netty | 03 - 客户端与服务端双向通信

客户端和服务器双向通信

GangsterChen & Codes 577

java netty 搭建_使用Netty搭建服务端和客户端过程详解

前言前面我们介绍了网络一些基本的概念,虽然说这些很难吧,但是至少要做到理解吧。有了之前的基础,我们来正式揭开Netty这神秘的面纱就会简单很多。服务端public class PrintServer {public void bind(int port) throws Exception {EventLoopGroup bossGroup = new NioEventLoopGroup(); ...

weixin_29200741的博客 665

SpringBoot:Netty-SocketIO + VUE:SocketIO实现前后端实时双向通信

WebSocket是HTML5新增的一种全双工通信协议,客户端和服务端基于TCP握手连接成功后,两者之间就可以建立持久性的连接,实现双向数据传输。传统HTTP和WebSocket的不同点:HTTP是单向数据流,客户端向服务端发送请求,服务端响应并返回数据;WebSocket连接后可以实现客户端和服务端双向数据传递。由于是新的协议,HTTP的url使用"http//"或"https//"开头;WebSocket的url使用"ws//"开头。

baidu_21349635的专栏 2146
上一篇: Netty(2)-服务端与客户端的启动流程
下一篇: Netty(4)-二进制载体ByteBuf
BoringRong
BoringRong 领域专家: 后端开发技术领域 领域专家: 后端开发技术领域
博客等级 码龄9年 2万+粉丝 386原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

BoringRong

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值