Netty服务端和客户端开发实例
一、Netty服务端开发
在开始使用 Netty 开发 TimeServer 之前,先回顾一下使用 NIO 进行服务端开发的步骤。
(1)创建ServerSocketChannel,配置它为非阻塞模式;
(2)绑定监听,配置TCP 参数,例如 backlog 大小;
(3)创建一个独立的I/O线程,用于轮询多路复用器 Selector;
(4)创建 Selector,将之前创建的 ServerSocketChannel 注册到 Selector 上,监听SelectionKey.ACCEPT;
(5)启动I/0线程,在循环体中执行 Selectorselect0)方法,轮询就绪的 Channel;
(6)当轮询到了处于就绪状态的 Channel 时,需要对其进行判断,如果是OP ACCEPT状态,说明是新的客户端接入,则调用 ServerSocketChannel.accept()方法接受新的客户端:(7)设置新接入的客户端链路 SocketChannel 为非阻塞模式,配置其他的一些TCP 参数(8)将SocketChannel注册到 Selector,监听 OP READ 操作位;
(9)如果轮询的Channel为OP READ,则说明 SocketChannel 中有新的就绪的数据包需要读取,则构造ByteBuffer 对象,读取数据包;
(10)如果轮询的Channel为OP WRITE,说明还有数据没有发送完成,需要继续发送。
import io.netty.bootstrap.ServerBootstrap;import io.netty.buffer.ByteBuf;
import io.netty.buffer.ByteBufAllocator;
import io.netty.buffer.CompositeByteBuf;
import io.netty.buffer.Unpooled;
import io.netty.channel.*;
import io.netty.channel.nio.NioEventLoopGroup;
import io.netty.channel.socket.SocketChannel;
import io.netty.channel.socket.nio.NioServerSocketChannel;
import io.netty.handler.codec.string.StringDecoder;
import io.netty.handler.timeout.IdleStateHandler;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Value;public class nettyServer {Logger logger = LoggerFactory.getLogger(nettyServer.class);@Value("${netty.port}")int port;@PostConstructpublic void bind() {EventLoopGroup bossrGroup = new NioEventLoopGroup();//接收客户端传过来的请求EventLoopGroup wokerGroup = new NioEventLoopGroup();//接收到请求后将后续操作try {ServerBootstrap b = new ServerBootstrap();b.group(bossrGroup, wokerGroup).channel(NioServerSocketChannel.class).option(ChannelOption.SO_BACKLOG, 1024)//.childOption(ChannelOption.SO_KEEPALIVE, true).childHandler(new ChannelInitializer<SocketChannel>() {@Overrideprotected void initChannel(SocketChannel ch) throws Exception {ch.pipeline().addLast(new serverHandlerAdapter());ch.pipeline().addLast(new StringDecoder());ch.pipeline().addLast(new HeartbeatHandler());ch.pipeline().addLast(new IdleStateHandler(10, 1, 1));}});ChannelFuture f = b.bind(port).sync();} catch (Exception e) {}}import io.netty.channel.ChannelHandlerContext;
import io.netty.channel.ChannelInboundHandlerAdapter;public class serverHandlerAdapter extends ChannelInboundHandlerAdapter {@Overridepublic void channelActive(ChannelHandlerContext ctx) throws Exception {super.channelActive(ctx);}@Overridepublic void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception {super.channelRead(ctx, msg);}@Overridepublic void channelReadComplete(ChannelHandlerContext ctx) throws Exception {super.channelReadComplete(ctx);}@Overridepublic void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) throws Exception {super.exceptionCaught(ctx, cause);}二、Netty客户端开发
import io.netty.bootstrap.Bootstrap;
import io.netty.channel.ChannelHandler;
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 nettyClient {clientHandlerAdapter clientHandlerAdapter = new clientHandlerAdapter();public void conect(String ip, int port) {EventLoopGroup group = new NioEventLoopGroup();try {Bootstrap b = new Bootstrap();b.group(group).channel(NioSocketChannel.class).remoteAddress("", port).handler(new ChannelInitializer<SocketChannel>() {@Overrideprotected void initChannel(SocketChannel ch) throws Exception {ch.pipeline().addLast(clientHandlerAdapter);}});b.bind(ip, port).sync();} catch (Exception e) {}}public boolean sendFile() {return clientHandlerAdapter.sendFile();}}我们从 connect 方法讲起,在第 13 行首先创建客户端处理 I/0 读写的 NioEventLoopGroup 线程组,然后继续创建客户端辅助启动类 Bootstrap,随后需要对其进行配置。与服务端不同的是,它的 Channel 需要设置为 NioSocketChannel,然后为其添加 handler,此处为了简单直接创建匿名内部类,实现 initChannel 方法,其作用是当创建 NioSocketChannel成功之后,在初始化它的时候将它的 ChannelHandler 设置到 ChannelPipeline 中,用于处理网络I/O事件。
客户端启动辅助类设置完成之后,调用 connect 方法发起异步连接,然后调用同步方法等待连接成功。
最后,当客户端连接关闭之后,客户端主函数退出,在退出之前,释放 NIO 线程组的资源。
下面我们继续看下TimeClientHandler 的代码如何实现
相关文章:
Netty服务端和客户端开发实例
一、Netty服务端开发在开始使用 Netty 开发 TimeServer 之前,先回顾一下使用 NIO 进行服务端开发的步骤。(1)创建ServerSocketChannel,配置它为非阻塞模式;(2)绑定监听,配置TCP 参数,例如 backlog 大小;(3)创建一个独立的I/O线程&…...
linux基本指令和权限
目录 一.shell命令以及运行原理 二.Linux常用指令 1. ls 指令 2. pwd命令 3.cd指令 4. touch指令 5.mkdir指令(重要) 6.rmdir指令 && rm 指令(重要) 7.man指令(重要) 8.cp指令(重要&…...
滚蛋吧,正则表达式!
大家好,我是良许。 不知道大家有没有被正则表达式支配过的恐惧?看着一行火星文一样的表达式,虽然每一个字符都认识,但放在一起直接就让人蒙圈了~ 你是不是也有这样的操作,比如你需要使用「电子邮箱正则表达式」&…...
序列号和反序列化--java--Serializable接口--json序列化普通使用
序列化和反序列化序列化和反序列化作用为什么需要用途Serializable使用serialVersionUID不设置的后果什么时候修改Externalizable序列化的顺序json序列化序列化和反序列化 序列化:把对象转换为字节序列的过程称为对象的序列化。 反序列化:把字节序列恢复为对象的过…...
Java异步任务编排
多线程创建的五种方式: 继承Thread类实现runnable接口。实现Callable接口 FutureTask(可以拿到返回结果,阻塞式等待。)线程池创建。 ExcutorService service Excutors.newFixedThreadPool(10); service.excute(new Runnable01());另外一种创建线程池…...
Hive与HBase的区别及应用场景
当数据量达到一定量级的时候,存储和统计计算查询都会遇到问题,今天了解一下Hive和Hbase的区别和应用场景。 一、定义 Hive是基于Hadoop的一个数据仓库工具,可以将结构化的数据文件映射为一张数据库表,并提供简单的sql查询功能&am…...
C++之单例模式
目录 1. 请设计一个类,只能在堆上创建对象 2. 请设计一个类,只能在栈上创建对象 3.请设计一个类,不能被拷贝 C98 C11 4. 请设计一个类,不能被继承 C98 C11 5. 请设计一个类,只能创建一个对象(单例模式) 设计…...
Redis十大类型——Set与Zset常见操作
Redis十大类型——Set与Zset常见操作Set命令操作简列基本操作展示删除移动剪切集合运算Zset基本操作简列添加展示反转按分数取值获取分数值删除分数操作下标操作如果我们对Java有所了解,相信大家很容易就明白Set,在Redis中也一样,Set的value值…...
车载雷达实战之Firmware内存优化
内存(Memory)是计算机中最重要的部件之一,计算机运时的程序以及数据都依赖它进行存储。内存主要分为随机存储器(RAM),只读存储器(ROM)以及高速缓存(Cache)。仅仅雷达的原…...
【剑指Offer】JZ14--剪绳子
剪绳子详解1.问题描述2.解题思路3.具体实现1.问题描述 2.解题思路 首先想到的思路:因为是求乘积的最大值,所以如果截取剩下的是1,那还是它本身就没有意义。从此出发,考虑绳子长度是2、3、4、5…通过穷举法来找规律。 值–》拆分–…...
raspberry pi播放音视频
文章目录目的QMediaPlayerGStreamerwhat is GStreamer体系框架优势omxplayerwhat is omxplayercommand Linekey bindings运行过程中错误ALSA目的 实现在树莓派下外接扬声器, 播放某段音频, 进行回音测试。 QMediaPlayer 首先我的安装是5.11版本。 优先…...
【电子学会】2022年12月图形化二级 -- 老鹰捉小鸡
老鹰捉小鸡 小鸡正在农场上玩耍,突然从远处飞来一只老鹰,小鸡要快速回到鸡舍中,躲避老鹰的抓捕。 1. 准备工作 (1)删除默认白色背景,添加背景Farm; (2)删除默认角色小…...
C++的双端队列
双端队列介绍1.双端队列知识需知2.大试牛刀1.双端队列知识需知 由于队列是一种先进先出(FIFO)的数据结构,因此无法直接从队列的底部删除元素。如果希望从队列的底部删除元素,可以考虑使用双端队列(deque)。…...
【独家】华为OD机试 - 拼接 URL(C 语言解题)
最近更新的博客 华为od 2023 | 什么是华为od,od 薪资待遇,od机试题清单华为OD机试真题大全,用 Python 解华为机试题 | 机试宝典【华为OD机试】全流程解析+经验分享,题型分享,防作弊指南)华为od机试,独家整理 已参加机试人员的实战技巧文章目录 最近更新的博客使用说明本期…...
为什么使用Junit单元测试?Junit的详解
Hi I’m Shendi 为什么使用Junit单元测试?Junit的详解 Junit简介 Junit是一个Java语言的单元测试框架。 单元测试是一个对单一实体(类或方法)的测试 JUnit是由 Erich Gamma 和 Kent Beck 编写的一个回归测试框架(regression test…...
怎么学好嵌入式Linux系统和驱动
嵌入式专业是一门实践性非常强的学科,只有多动手,多实践,多编程,多调试,多看书,多思考才能真正掌握好嵌入式开发技术。 现在很多同学也意识到了学校培养模式和社会需求脱节问题,有一部分同学也先…...
Spring Aware总结
概述 Spring中Aware到底是什么意思? 我们在看Spring源码的时候,经常可以看到xxxAwarexxx的身影,通常我会很疑惑,Aware到底是什么意思呢? 比如图片中这些包含Aware关键字的类或者接口。 我对下面3个类或接口进行了解…...
【RocketMQ】源码详解:Broker端消息刷盘流程
消息刷盘 同步入口:org.apache.rocketmq.store.CommitLog.GroupCommitService 异步入口:org.apache.rocketmq.store.CommitLog.FlushRealTimeService 刷盘有同步和异步两种,在实例化Commitlog的时候,会根据配置创建不同的服务 p…...
编码器SIQ-02FVS3驱动
一.简介 此编码器可以是功能非常强大,可以检测左右转动,和按键按下,所以说这一个编码器可以抵三个按键,而且体积非常小,使用起来比三个按键要高大尚,而且驱动也简单。唯一不足的点就是价格有点小贵6-8元才…...
【2021.9.7】记一次exe手动添加shellcode
【2021.9.7】记一次exe手动添加shellcode 文章目录【2021.9.7】记一次exe手动添加shellcode0.大致思路1.获取MessageBox的真实地址VA2.通过OD在代码段添加shellcode3.dump出数据,设置程序OEP4.测试dump出来的exe5.方法总结测试的exe和添加了shellcode的exe:链接&…...
RTX4090D性能实测:OpenClaw调用Qwen3-32B镜像的token消耗优化
RTX4090D性能实测:OpenClaw调用Qwen3-32B镜像的token消耗优化 1. 测试背景与设备环境 去年底入手RTX4090D显卡后,我一直想验证它在本地大模型推理场景的实际表现。最近在星图平台发现预置Qwen3-32B模型的优化镜像,正好配合OpenClaw做自动化…...
Jimeng LoRA惊艳效果:同一LoRA版本在不同seed下风格稳定性测评
Jimeng LoRA惊艳效果:同一LoRA版本在不同seed下风格稳定性测评 1. 项目简介 今天我们来聊聊一个很有意思的话题:同一个LoRA模型,用不同的随机种子(seed)生成图片,它的风格到底稳不稳定? 为了…...
百川2-13B-4bits量化模型+OpenClaw:低成本自动化办公方案实测
百川2-13B-4bits量化模型OpenClaw:低成本自动化办公方案实测 1. 为什么选择量化模型OpenClaw组合 去年我接手了一个需要处理大量邮件的项目,每天要花3小时在重复性回复上。当我尝试用OpenClaw自动化流程时,发现原版大模型的显存占用让我的R…...
Step3-VL-10B基础教程:Gradio WebUI本地/远程访问配置与常见报错解决
Step3-VL-10B基础教程:Gradio WebUI本地/远程访问配置与常见报错解决 1. 引言 你是不是已经部署好了Step3-VL-10B这个强大的视觉语言模型,但在浏览器里输入地址后,要么页面打不开,要么显示一堆看不懂的错误信息?别着…...
OpenClaw+Qwen3-14B自动化测试:3种Python脚本执行方案对比
OpenClawQwen3-14B自动化测试:3种Python脚本执行方案对比 1. 为什么需要测试Python脚本执行方案? 上周我在尝试用OpenClaw自动化执行数据分析任务时,遇到了一个典型问题:同样的Python脚本,在不同执行环境下表现差异巨…...
任务追踪智能体(二)
个人任务简介 负责项目核心业务功能开发,包括 AI 智能评分、文件预览、数据导出等关键功能。这些功能是整个项目的价值核心,直接面向用户使用场景,实现对项目申报书的自动化AI评分。将申报文件转换为前端可预览的格式,支持 PDF 原…...
React Native Interactable终极指南:TouchesInside与静态交互对比详解
React Native Interactable终极指南:TouchesInside与静态交互对比详解 【免费下载链接】react-native-interactable Experimental implementation of high performance interactable views in React Native 项目地址: https://gitcode.com/gh_mirrors/re/react-na…...
OpenClaw+千问3.5-9B自动化写作:技术博客大纲与初稿生成
OpenClaw千问3.5-9B自动化写作:技术博客大纲与初稿生成 1. 为什么需要自动化写作助手 作为一个技术博主,我经常面临这样的困境:明明对某个技术点有深刻理解,却卡在如何组织文章结构上。有时候花在列大纲上的时间比实际写作还长&…...
BGP选路实战:从理论到实验的十三条法则
1. BGP选路原则概述:网络工程师的导航系统 如果把互联网比作一个超级城市,BGP就是这座城市的路由导航系统。作为网络工程师,我们每天都要处理成千上万条路由信息,而BGP的十三条选路原则就是帮助我们做出最优路径选择的黄金法则。这…...
从Claude Code代码泄漏到AI Agent逻辑设计VS龙虾OpenClaw
近期 Anthropic的Claude Code 的源码泄露事件,为业界提供了一份价值连城的“活体解剖指南”。本文将深入对比高内聚的 Claude Code 架构与高解耦的 OpenClaw 通用框架,从系统执行逻辑、上下文管理、OS 沙盒交互以及记忆提纯等维度,探讨次世代 AI Agent 在模型推理与工程落地…...
