netty中的session属性设置和链接事件捕获

AI权益加码!Claude Code、Cursor等20+工具免费用! 购周边限时加赠Coding Plan Lite,畅享主流AI工具!学习进阶更高效! 阅读详情

Netty的使用比mina更灵活,也更复杂,下面通过一个例子,主要说明netty中如何对某个链接设置属性,并顺带描述了链接事件捕获

 

import io.netty.bootstrap.ServerBootstrap;
import io.netty.channel.ChannelFuture;
import io.netty.channel.ChannelHandlerContext;
import io.netty.channel.ChannelInboundHandlerAdapter;
import io.netty.channel.ChannelInitializer;
import io.netty.channel.ChannelOption;
import io.netty.channel.EventLoopGroup;
import io.netty.channel.nio.NioEventLoopGroup;
import io.netty.channel.socket.SocketChannel;
import io.netty.channel.socket.nio.NioServerSocketChannel;
import io.netty.handler.timeout.IdleState;
import io.netty.handler.timeout.IdleStateEvent;
import io.netty.handler.timeout.IdleStateHandler;
import io.netty.util.AttributeKey;

public class NettyAttrTest {

	public static void main(String[] args) throws InterruptedException {
	    EventLoopGroup bossGroup = new NioEventLoopGroup(); 
	    EventLoopGroup workerGroup = new NioEventLoopGroup();
	    try {
	        ServerBootstrap b = new ServerBootstrap();
	        b.group(bossGroup, workerGroup)
	         .channel(NioServerSocketChannel.class)
	         .childHandler(new ChannelInitializer<SocketChannel>() {
	        	private static final int IDEL_TIME_OUT = 10;
	            private static final int READ_IDEL_TIME_OUT = 4;
	        	private static final int WRITE_IDEL_TIME_OUT = 5;
	        	private AttributeKey<Long> START_TIME = new AttributeKey<Long>("START_TIME");
	             @Override
	             public void initChannel(SocketChannel ch) throws Exception {
	            	 //idle<strong>事件</strong>监听
	         		ch.pipeline().addLast("idleStateHandler", new IdleStateHandler(READ_IDEL_TIME_OUT, WRITE_IDEL_TIME_OUT, IDEL_TIME_OUT));
	                ch.pipeline().addLast(new ChannelInboundHandlerAdapter(){
	                	
	                	@Override
	                	public void channelRegistered(ChannelHandlerContext ctx)//链接<strong>事件</strong>监听
	                			throws Exception {
	                		System.out.println("channel register");
	                		//<strong>设置</strong>链接<strong>属性</strong>,记录链接开始的时间
	                		ctx.attr(START_TIME).set(System.currentTimeMillis());
	                	}
	                	
	                	@Override
	                	public void channelUnregistered(//断开链接<strong>事件</strong>
	                			ChannelHandlerContext ctx) throws Exception {
	                		System.out.println("channel unregister");
	                	}
	                	
	                	@Override
	                	public void userEventTriggered(//<strong>事件</strong>监听
	                			ChannelHandlerContext ctx, Object evt)
	                			throws Exception {
	                		//监听idle<strong>事件</strong>
	                		if(IdleStateEvent.class.isAssignableFrom(evt.getClass())){
	                			IdleStateEvent event = (IdleStateEvent) evt;
	                			//获取链接相关的<strong>属性</strong>(即链接开始的时间戳)
	                			Long startTime = ctx.attr(START_TIME).get();
	                			if(startTime == null)
	                				//not arrive forever
	                				return;
	                			//read idle
	                			if(event.state() == IdleState.READER_IDLE)
	                				System.out.println("read idle"+startTime);
	                			//write idle
	                			else if(event.state() == IdleState.WRITER_IDLE)
	                				System.out.println("write idle"+startTime);
	                			//read and write idle
	                			else if(event.state() == IdleState.ALL_IDLE)
	                				System.out.println("all idle"+startTime);
	                		}
	                	}
	                });
	             }
	         })
	         .option(ChannelOption.SO_BACKLOG, 128)
	         .childOption(ChannelOption.SO_KEEPALIVE, true);
	        
	        ChannelFuture f = b.bind(8080).sync();
	        f.channel().closeFuture().sync();
	    } finally {
	        workerGroup.shutdownGracefully();
	        bossGroup.shutdownGracefully();
	    }
	}
	
	
}


channelRegistered用于监听链接事件,当客户端链接时,将链接的时间记录在ctx的attr中。

 userEventTriggered中针对某一个特定的链接取出其链接时间,并输出出来。

测试:开启两个telnet客户端:

telnet 127.0.0.1 8080

结果:

channel register

channel register

read idle1378195113609

write idle1378195113609

read idle1378195117015

read idle1378195113609

write idle1378195117015

all idle1378195113609

write idle1378195113609

read idle1378195117015

read idle1378195113609

all idle1378195117015

write idle1378195117015

Netty处理TCP连接的session Netty处理TCP连接的session 在同步阻塞的网络编程中,代码都是按照TCP操作顺序编写的,即创建连接、多次读写、关闭连接,这样很容易判断这一系列操作是否是同一个连接。而在事件驱动的异步网络编程框架中,IO操作都会触发一个事件调用相应的事件函数,例如接收到客户端的新数据,会调用messageReceived(MINA)、channelRead(Netty)、dataReceived( 阅读详情

相关推荐

Netty相关网络IO面试题(20题)

摘要 : 本文主要介绍网络编程, NETTY io 核心面试题 20道大题,穿插部分小题,可以用作复习!

Kaka_csdn14的博客 1478

Netty实战与调优

提供两个实现,我这里直接将实现加入了枚举类 Serializer.Algorithm 中。为了支持更多序列化算法,抽象一个 Serializer 接口。序列化,反序列化主要用在消息正文的转换上。增加配置类配置文件。

冰点契约的博客 1209

Netty网络聊天室之会话管理

浏览器第一次与服务器建立连接的时候,服务器就会自动为之分配一个Session。在我们的聊天室,也可以使用Session来判断用户是否经过登录验证,保存用户的各种信息,向客户端发送消息。这极大方便了程序对客户端的管理。

littleschemer的博客 1万+

Netty中的session属性设置链接事件捕获

Netty中的session属性设置链接事件捕获 Netty的使用比mina更灵活,也更复杂,下面通过一个例子,主要说明netty中如何对某个链接设置属性,并顺带描述了链接事件捕获。   import io.netty.bootstrap.ServerBootstrap; import io.netty.channel.ChannelFuture; import io.netty.c

关新全的专栏 1万+

Netty聊天系统】吃透 SpringBoot + Netty , 还开发不了通讯系统?(三)session

Netty聊天系统】吃透 SpringBoot + Netty , 还开发不了通讯系统?(三) 这篇把准备工作都做好了,自定义解码编码器都写好,以及handler等等

xiaoxin0630的博客 1296

Redisson分布式会话:Spring Session集成与优化

在分布式系统中,会话管理一直是开发者面临的重要挑战。传统单机环境下的会话机制在集群环境中会导致用户状态丢失、登录状态不一致等问题。本文将介绍如何使用Redisson实现分布式会话管理,通过与Spring Session的无缝集成,解决分布式环境下的会话共享难题,并提供实用的优化建议。 ## 核心概念与架构 Redisson提供了基于Redis的分布式会话解决方案,通过将Session数据存储在...

gitblog_00690的博客 1119

Netty 学习 之(2)TCP网关详解

关注,私信赠送netty源码分析学习视频 ! netty是什么 介绍 物联网设备网关技术架构设计(Session 管理、心跳管理、数据上行、数据下行) 说明 NioEventLoop 是 Netty 的 Reactor 线程,其角色: Boss Group:作为服务端 Acceptor 线程,用于 accept 客户端链接,并转发给 WorkerGroup 中的线程。 Work...

vincent 9854

2024-09-16Netty干货分享:京东京麦的生产级TCP网关技术实践总结

一般像这样的大企业都有好几轮面试,所以自己一定要花点时间去收集整理一下公司的背景,公司的企业文化,俗话说「知己知彼百战不殆」,不要盲目的去面试,还有很多人关心怎么去跟HR谈薪资。这边给大家一个建议,如果你的理想薪资是30K,你完全可以跟HR谈33~35K,而不是一下子就把自己的底牌暴露了出来,不过肯定不能说的这么直接,比如原来你的公司是25K,你可以跟HR讲原来的薪资是多少,你们这边能给到我的是多少?你说我这边希望可以有一个20%涨薪。

2401_84024148的博客 806

Netty与OpenSSL双向认证实战:从原理到TLS握手深度解析

SSL/TLS协议是保障网络通信安全的基石,它通过非对称加密协商出对称会话密钥,实现数据的机密性与完整性。双向认证(mTLS)在此基础上,要求通信双方交换并验证数字证书,为服务间通信提供了强身份验证,是构建零信任架构的关键技术。其核心价值在于防止中间人攻击未授权访问,广泛应用于金融交易、物联网设备认证及微服务安全通信等场景。本文聚焦于高性能网络框架Netty与密码学库OpenSSL的集成,通过剖析TLS握手流程与事件驱动模型,详解如何构建高安全性的双向认证服务。

weixin_30421809的博客 458

2020-09-16Netty干货分享:京东京麦的生产级TCP网关技术实践总结

基于Netty构建京麦TCP网关的长连接容器,作为网关接入层提供服务API请求调用。客户端通过域名+端口访问TCP网关,域名不同的运营商对应不同的VIP,VIP发布在LVS上,LVS将请求转发给后端的HAProxy,再由HAProxy把请求转发给后端的Netty的IP+Port。LVS转发给后端的HAProxy,请求经过LVS,但是响应是HAProxy直接反馈给客户端的,这也就是LVS的DR模式。4、TCP网关长连接容器架构。

2401_89087811的博客 839

netty服务器主动发信息,netty4,服务端向客户端主动发消息怎么把channel存储到redis缓存中?...

怎么把netty链接通道存储到redis中这样后续可以通过key取出channel给客户端发消息我们项目中大致是这么做的:无论是自己写数据结构还是使用Jedis,大概都是有一个类似Map的结构。建立一个Bean用于表示会话,此处暂且称之为Session。在Session里引用nettyChannel。在channelActive时将其放入redis。有必要的话,可以将channel.id()....

weixin_32536777的博客 2714

深入解析Moquette架构:Netty驱动的高性能MQTT服务器

Moquette是一款基于Java开发的轻量级MQTT服务器,采用Netty框架实现高性能网络通信,专为物联网场景设计。其事件驱动架构优化的消息处理机制,使其成为资源受限环境下的理想选择。本文将深入剖析Moquette的核心架构设计与技术实现。 ## 🚀 核心架构概览 Moquette采用分层设计,主要由四大核心组件构成: - **网络层**:基于Netty实现的异步通信框架 - **协

gitblog_00627的博客 936

Netty源码分析---NioEventLoopGroup深度解析

本文深入解析了Netty中的NioEventLoopGroup线程池实现。NioEventLoopGroup是为NIO模型专门设计的事件循环线程池,由多个NioEventLoop线程组成,每个线程对应一个Selector任务队列。文章详细介绍了其继承体系、构造过程、线程选择策略等核心机制。重点分析了默认线程数设置为CPU核心数*2的原因,以及bossGroupworkerGroup的分工设计。此外还讲解了线程池创建流程、任务执行机制优雅关闭过程,揭示了Netty高性能背后的线程模型设计思想。

java_rutu的博客 373

Netty游戏服务器开发实战(14):游戏推送的设计

导读- 本篇主要介绍如何实现游戏服务器推送消息到客户端或者服务器服务器之间进行消息推送,结合Netty组件,设计一个具有推送功能的高性能游戏服务器框架。 什么是推送?为何需要推送? 首先,我们要明白什么是推送?推送,就是把服务器消息或者某个客户端的消息发送给另外一个客户端或者是服务器,一般对于客户端来说是一个被动接受消息的过程。 在游戏服务器中,游戏活动的开始 ...

被世界遗弃的江的博客 2634

Netty与OpenSSL实现双向SSL认证:5分钟搭建高安全通信服务

SSL/TLS协议是保障网络通信安全的基石,通过非对称加密、数字证书握手协议实现数据传输的机密性、完整性身份验证。其核心价值在于建立可信的加密通道,防止窃听篡改,广泛应用于金融交易、API通信微服务架构等场景。双向SSL认证(mTLS)在传统单向验证基础上,要求客户端也提供证书,实现严格的双向身份鉴权,特别适合内部服务间通信敏感接口保护。本文基于Netty高性能框架OpenSSL密码学库,通过实战演示如何快速构建支持双向认证的服务端与客户端,涵盖证书生成、SslContext配置常见问题排查,

weixin_30596165的博客 397

Netty Redis 亿级流量 高并发 实战 (长文 修正版)

目录 疯狂创客圈 Java 分布式聊天室【 亿级流量】实战系列之 -30【 博客园 总入口 】 写在前面 1.1. 快速的能力提升,巨大的应用价值 1.1.1. 飞速提升能力,并且满足实际开发要求 1.1.2. 越来越多、大量的应用场景 1.2....

weixin_34331102的博客 1220

Java最新2024-09-16Netty干货分享:京东京麦的生产级TCP网关技术实践总结,java工厂模式面试

这份《“java高分面试指南”-25分类227页1000+题50w+字解析》同样可分享给有需要的朋友,感兴趣的伙伴们可挑战一下自我,在不看答案解析的情况,测试测试自己的解题水平,这样也能达到事半功倍的效果!(好东西要大家一起看才香)本文已被CODING开源项目:【一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码】收录需要这份系统化的资料的朋友,可以点击这里获取本文已被CODING开源项目:【一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码】收录。

2401_84557926的博客 418
上一篇: java byte 字节转short
下一篇: URIs, URLs, and URNs
caobai
博客等级 码龄18年 7粉丝 9原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值