Netty的AttributeMap

netty学习笔记 立即下载

Netty的AttributeMap

AttributeMap接口

public interface AttributeMap {  
    <T> Attribute<T> attr(AttributeKey<T> key);  
}
AttributeMap接口只有一个attr()方法,接收一个AttributeKey类型的key,返回一个Attribute类型的value。按照Javadoc,AttributeMap实现必须是线程安全的。所有的Channel和ChannelHandlerContext实现了AttributeMap接口

简单应用:

public class AttributeMapID {
	public static final AttributeKey<ChannelID> Channel_ID = AttributeKey.valueOf("netty.channel");
}
public class ClienHandler extends ChannelInboundHandlerAdapter{

	@Override
	public void channelActive(ChannelHandlerContext ctx) throws Exception {
					Attribute<ChannelID> attribute =  ctx.attr(Channel_ID);
					ChannelID channelID = attribute.get();
					if (channelID==null) {
						ChannelID id = new ChannelID("link",new Date());
						channelID = attribute.setIfAbsent(id);
					} else {
						System.out.println("channelActive attributeMap 中是有值的");  
			            System.out.println(channelID.getName() + "=======" + channelID.getDate());  
					}
					  System.out.println("HelloWorldC0ientHandler Active");  
				        ctx.fireChannelActive();   
	}

	@Override
	public void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception {
		Attribute<ChannelID> attribute =  ctx.attr(Channel_ID);
		ChannelID channelID = attribute.get();
		if (channelID==null) {
			ChannelID id = new ChannelID("link",new Date());
			channelID = attribute.setIfAbsent(id);
		} else {
			System.out.println("channelActive attributeMap 中是有值的");  
            System.out.println(channelID.getName() + "=======" + channelID.getDate());  
		}
		
		System.out.println("HelloWorldClientHandler read Message:" + msg);  
        
        ctx.fireChannelRead(msg);  
	}
		
}
public class Server {
	int port;
	public Server(int port) {
				this.port = port;
				start();
	}
	
	public void start() {
		  EventLoopGroup bossGroup = new NioEventLoopGroup(1);  
	        EventLoopGroup workerGroup = new NioEventLoopGroup();  
	        try {  
	            ServerBootstrap sbs = new ServerBootstrap().group(bossGroup,workerGroup).channel(NioServerSocketChannel.class).localAddress(new InetSocketAddress(port))  
	                    .childHandler(new ChannelInitializer<SocketChannel>() {  
	                          
	                        protected void initChannel(SocketChannel ch) throws Exception {  
	                            ch.pipeline().addLast("decoder", new StringDecoder());  
	                            ch.pipeline().addLast("encoder", new StringEncoder());  
	                            ch.pipeline().addLast(new ServerHandler());  
	                        };  
	                          
	                    }).option(ChannelOption.SO_BACKLOG, 128)     
	                    .childOption(ChannelOption.SO_KEEPALIVE, true);  
	             // 绑定端口,开始接收进来的连接  
	             ChannelFuture future = sbs.bind(port).sync();    
	               
	             System.out.println("Server start listen at " + port );  
	             future.channel().closeFuture().sync();  
	        } catch (Exception e) {  
	            bossGroup.shutdownGracefully();  
	            workerGroup.shutdownGracefully();  
	        }  
	}
	
	
	
	public static void main(String[] args) {
			Server server = new Server(7788);
	}

}
public class ServerHandler extends ChannelInboundHandlerAdapter{

	@Override
	public void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception {
		 System.out.println("server channelRead..");  
	        System.out.println(ctx.channel().remoteAddress()+"->Server :"+ msg.toString());  
	        ctx.write("server write"+msg);  
	        ctx.flush();  
	}
		
}
public class Client {
		
	String host;
	int port;
	
	public Client(String host,int port) throws InterruptedException {
		// TODO Auto-generated constructor stub
		this.host = host;
		this.port =port;
		connect();
	}
	
	public void connect() throws InterruptedException {
		  EventLoopGroup group = new NioEventLoopGroup();  
	        try {  
	            Bootstrap b = new Bootstrap();  
	            b.group(group)  
	             .channel(NioSocketChannel.class)  
	             .option(ChannelOption.TCP_NODELAY, true)  
	             .handler(new ChannelInitializer<SocketChannel>() {  
	                 @Override  
	                 public void initChannel(SocketChannel ch) throws Exception {  
	                     ChannelPipeline p = ch.pipeline();  
	                     p.addLast("decoder", new StringDecoder());  
	                     p.addLast("encoder", new StringEncoder());  
	                     p.addLast(new ClienHandler());  
	                    
	                 }  
	             });  
	  
	            ChannelFuture future = b.connect(host,port).sync();  
	            future.channel().writeAndFlush("hello Netty,Test attributeMap");  
	            future.channel().closeFuture().sync();  
	        } finally {  
	            group.shutdownGracefully();  
	        }  
	}
	
	
	public static void main(String[] args) throws InterruptedException {
				Client client = new Client("127.0.0.1", 7788);
	}
}
public class ChannelID {
			
	String name;
	Date date;
	public ChannelID(String name,Date date) {
		// TODO Auto-generated constructor stub
		this.date = date;
		this.name = name;
	}
	
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public Date getDate() {
		return date;
	}
	public void setDate(Date date) {
		this.date = date;
	}
	
	
	
}
移动端安全实战:如何用Unidbg动态分析小红书so加密协议(附CRC32校验破解) 本文深入解析小红书移动端so加密协议,通过Unidbg框架实现动态分析,重点破解CRC32校验与白盒AES算法。文章提供从环境搭建到协议逆向的全流程实战指南,涵盖SO文件反混淆、动态Hook技术及加密算法破解,为移动安全工程师提供高效分析方案。 阅读详情

相关推荐

A-Level经济例题解析及练习Opportunity Cost

例题Question: Opportunity CostYou are selling your 1996 Mustang.&nbsp; You have already spent $1000 on repairs.&nbsp;At the last minute, the transmission dies.&nbsp; You can pay $600 to have it repaired, or sell the car “as is.”In each of the fol

Alevel3的博客 746

Netty中的AttributeMap属性(AttributeKey、AttributeMap、Attribute)

文章目录0.AttributeKey、AttributeMap、Attribute0.1 Attribute接口0.2 AttributeKey类0.3 AttributeMap1.前言2. 使用3.例子2.实例2 参考文章,点击这里 原文章,点击这里 0.AttributeKey、AttributeMap、Attribute AttributeMap可以看成是一个key为AttributeKey类型,value为Attribute类型的Map,而Attribute内存储的是一个值引用,它可以原子的更新内容

weixin_42030357的博客 7368

从压电传感器到示波器:手把手教你用CA3140搭建电荷放大器(含PCB布局与调零技巧)

本文详细介绍了如何使用CA3140运算放大器搭建专业级电荷放大器,从压电传感器信号特性分析到PCB布局与调零技巧,全程实战演示。重点解析了CA3140的低通滤波器设计、反馈网络参数计算及抗干扰增强方案,帮助电子爱好者高效实现微弱电荷信号的稳定转换与测量。

weixin_31355483的博客 600

Netty之DefaultAttributeMap与AttributeKey的机制和原理

Netty 的 DefaultAttributeMap 源码分析

黄裳博客 1099

神经网络基础概念总结(小白入门自用)

神经网络人工神经网络多层感知机激活函数反向传播算法损失函数权值初始化正则化方法 人工神经网络 人工神经元:人工神经元是人工神经网络的基本单元。模拟生物神经元,人工神经元有1个或者多个输入(模拟多个树突或者多个神经元向该神经元传递神经冲动);对输入进行加权求和(模拟细胞体将神经信号进行积累和树突强度不同);对输入之和使用激活函数计算活性值(模拟细胞体产生兴奋或者抑制);输出活性值并传递到下一个人工神经元(模拟生物神经元通过轴突将神经冲动输入到下一个神经元)。 人工神经网络:大量的人工神经元以某种链接方式得来的

qq_42011158的博客 650

树莓派驱动DLPDLCR230NPEVM+framebuffer显示图片

DLPDLCR230NPEVM DLP® LightCrafter™ Display 230NP 是一个易于使用的紧凑型即插即用评估平台,适用于消费类产品、工业、医疗和物联网 (IoT) 市场中的各种超便携显示应用。此评估模块 (EVM) 采用 DLP230NP 芯片组,该芯片组由DLP230NP.23 1080p DMD、DLPC3436显示控制器和DLPA2005PMIC/LED 驱动器组成。此 EVM 外形小巧,配备生产就绪型光学引擎以及支持 18 位 RGB 并行视频接口...

L_Y000的博客 2620

一起学Netty(十五)之 AttributeMap属性

本来没打算研究这个东西的,一开始觉得没啥用,甚至觉得这个东西有点鸡肋,不过慢慢接触之后,发现了这个AttributeMap的重要性 初学这个东西,我们还是先理解AttributeMap的用法吧 AttributeMap这个是

BazingaLyncc 2万+

Workbench下列车转向架随机振动疲劳分析

结果中添加功率谱响应工具(Response PSD Tool),可以查看几何体以及远程点上的功率谱密度,如下图11所示,这里查看几何体上某一硬点的加速度功率谱密度响应曲线,如下图12所示。结果中添加疲劳工具(Fatigue Tool),查看列车转向架的疲劳寿命情况,这里采用窄带的寿命假设理论,曝光时间为1s指明计算出的疲劳寿命的基本单位是秒,寿命结果如下图14所示,可以看到最大寿命为1e35s,最小寿命为2.3542e18s,注意单位制,可再次基础上将其转换为小时或天。频域上的统计计算,软件很快计算完成。

ansysxuexizhe的博客 2605

【Netty】【源码】AttributeMap相关

JAVA本身有map接口及各种实现,Netty又根据自身的需要,进行了重新实现。个人感觉更多是针对使用习惯上及特定场景上的不同,进行重新的封装实现。(当然更多引用该接口的地方还没来的及看,有更多设计上的考虑也是有可能的)。整个看下来,技巧性的东西很值得学习。比如Attribute封装map的操作,用id来排序(用于二分查找),以及用map存储来使同名key唯一,以使用==来判断是否同一个key来代替equals判断。。。所有这些都是为了读多写少,key复用(每个channel都需要存储对应的key)的场景。

凉水的博客 526

UE5音效系统全解析:从Sound Cue到MetaSounds的实战指南

在游戏开发中,音频系统是构建沉浸式体验的关键技术之一。其核心原理在于通过数字信号处理(DSP)和空间音频渲染,模拟真实世界的听觉感知。传统音频管线通常基于静态资源播放与混合,而现代引擎则引入了程序化音频生成与动态调制技术,这极大地提升了音频的互动性与表现力,使其能够实时响应游戏状态变化。这一技术革新对于开发开放世界、VR及3A级游戏尤为重要,它能实现风吹草动皆有不同声响、音效随环境动态变化的细腻效果。本文聚焦虚幻引擎5(UE5)的音效系统,深入剖析其新旧两套核心架构:稳定高效的Sound Cue、Sound

weixin_31179927的博客 333

ROS2 - 乐动激光雷达 LD06

STL-06P 主要由激光测距核心,无线传电单元,无线通讯单元,角度测量单元、电机驱动单元和机械外壳组成。STL-06P 测距核心采用 DTOF 技术,可进行每秒 5000 次的测距。每次测距时,雷达发射出红外激光,激光遇到目标物体后被反射到单光子接收单元。

机器人控制与仿真应用 3496

Netty的AttributeMap属性

一起学Netty(十五)之 AttributeMap属性这个小哥写的很全面了,大家可以了解下一起学Netty(十五)之 AttributeMap属性

cmqwan的博客 8359

详解Xilinx FPGA高速串行收发器GTX/GTP(6)--Pattern Generator/Pattern Checker

详解Xilinx FPGA高速串行收发器GTX/GTP(6)--Pattern Generator/Pattern Checker

孤独的单刀 1628

Netty 之 AttributeMap属性

本来没打算研究这个东西的,一开始觉得没啥用,甚至觉得这个东西有点鸡肋,不过慢慢接触之后,发现了这个AttributeMap的重要性 初学这个东西,我们还是先理解AttributeMap的用法吧 1)AttributeMap这是是绑定在Channel或者ChannelHandlerContext上的一个附件,相当于依附在这两个对象上的寄生虫一样,相当于附件一样,如图所示:

z69183787的专栏 6974

Statistics and Machine Learning Toolbox

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

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

Netty笔记(七)之AttributeMap

文章目录netty版本BootstrapBootstrapServerBootstrap netty版本 netty版本:io.netty:netty-all:4.1.29.Final Bootstrap 引导(Bootstrap)一个应用程序是对它进行配置,并使它运行起来的过程。Netty处理引导的方式使你的应用程序和网络层相隔离,无论它是客户端还是服务器。 Boostrap类层次结...

jannal专栏 627

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

Netty4学习笔记(7)-- AttributeMap

Netty4 AttributeMap接口介绍

zxh的专栏 2万+

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

Netty4学习笔记-- AttributeMap

IoSession MINA的IoSession接口定义了一组方法,让我们可以利用IoSession来存储一些数据: [java] view plain copy   public interface IoSession {       getAttribute(Object key)       getAttribute(Object 

z69183787的专栏 2990

netty(八):AttributeKey和AttributeMap实现不同channelContext中传递数据

1.AttributeMap 在netty4中将数据保存在channel中使用的是AttributeMap,如图,因为AbstractChannelHandlerContext实现了ChannelHandlerContext,而ChannelHandlerContext继承了AttributeMap。 故ChannelInboundHandlerAdapter实现了AttributeMap,可以把...

流的博客 2849

AttributeMap类详解

本来没打算研究这个东西的,一开始觉得没啥用,甚至觉得这个东西有点鸡肋,不过慢慢接触之后,发现了这个AttributeMap的重要性初学这个东西,我们还是先理解AttributeMap的用法吧1)AttributeMap这是是绑定在Channel或者ChannelHandlerContext上的一个附件,相当于依附在这两个对象上的寄生虫一样,相当于附件一样,如图所示:这个图还算比较形象地描述了Attr

heihei 3228

Netty权威指南 第2版学习笔记9——Channel,Unsafe和 AttributeMap

Channel功能说明io.netty.channel.Channel是Netty网络操抽象类,它聚合了一组功能,包括但不限于网络的读、写,客户端发起连接,主动关闭连接,链路关闭,获取通信双方的网络地址等。它也包含了Netty框架相关的一些功能框架,包括获取该Channel的EventLoop,获取缓冲分配器ByteBufAllocator和pipeline等。Channel的工作原理Channel

猿来这样-谢厂节的博客 1224

netty之AttributeMap

这几天开始看netty,作些笔记。 netty5文档中 ChannelHandler开始处介绍了attachment的使用,用来保存handler的状态信息 [code="java"] public class DataServerHandler extends SimpleChannelInboundHandler { private final AttributeKey au...

peijie73的博客 568

netty之AttributeKey的应用

  1)AttributeMap这是是绑定在Channel或者ChannelHandlerContext上的一个附件,相当于依附在这两个对象上的寄生虫一样,相当于附件一样,如图所示: 这个图还算比较形象地描述了AttributeMap的作用,我们知道每一个ChannelHandlerContext都是ChannelHandler和ChannelPipeline之间连接的桥梁,每一个Ch...

zcf9916的博客 1万+

java attribute属性_AttributeMap属性

本来没打算研究这个东西的,一开始觉得没啥用,甚至觉得这个东西有点鸡肋,不过慢慢接触之后,发现了这个AttributeMap的重要性初学这个东西,我们还是先理解AttributeMap的用法吧1)AttributeMap这是是绑定在Channel或者ChannelHandlerContext上的一个附件,相当于依附在这两个对象上的寄生虫一样,相当于附件一样,如图所示:这个图还算比较形象地描述了Att...

weixin_29577659的博客 586
上一篇: Java与算法(4)
下一篇: 基于Netty实现的简单聊天室(GUI版)
Coder_py
博客等级 码龄10年 106粉丝 258原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值