95-34-020-Context-ChannelHandlerContext

128 篇文章 426 订阅 ¥49.90 ¥99.00
ChannelHandlerContext在Netty中扮演着连接ChannelHandler和ChannelPipeline的角色,它用于事件传播和Handler之间的交互。ChannelHandlerContext提供了安全的上下文环境,允许设置和删除状态属性,并在事件传播中起到关键作用。一个ChannelHandler可以有多个对应的ChannelHandlerContext,特别是在使用Sharable注解时,同一个Handler实例会对应不同Channel的不同Context实例。
摘要由CSDN通过智能技术生成

文章目录


在这里插入图片描述

1. 概述

​ 每个ChannelHandler被添加到ChannelPipeline后,都会创建一个ChannelHandlerContext并
与之创建的ChannelHandler关联绑定。ChannelHandlerContext允许Channelllandler与其他的
ChannelHandler实现进行交互。ChannelHandlerContext不会改变添加到其中的ChannelHandler,因此它是安全的。

​ Context指上下文关系,ChannelHandler的Context指的是ChannleHandler之间的关系以及ChannelHandler与ChannelPipeline之间的关系。

​ ChannelPipeline中的事件传播主要依赖于ChannelHandlerContext实现,由于ChannelHandlerContext中有ChannelHandler之间的关系,所以能得到ChannelHandler的后继节点,从而将事件传播到下一个ChannelHandler。

​ ChannelHandlerContext继承自AttributeMap,所以提供了attr()方法设置和删除一些状态属性值,用户可将业务逻辑中所需使用的状态属性值存

要在Netty中使用WebSocket SSL,需要进行以下步骤: 1. 创建SSLContext对象 ``` KeyStore keyStore = KeyStore.getInstance("JKS"); InputStream stream = new FileInputStream("keystore.jks"); keyStore.load(stream, "password".toCharArray()); KeyManagerFactory kmf = KeyManagerFactory.getInstance(KeyManagerFactory.getDefaultAlgorithm()); kmf.init(keyStore, "password".toCharArray()); TrustManagerFactory tmf = TrustManagerFactory.getInstance(TrustManagerFactory.getDefaultAlgorithm()); tmf.init(keyStore); SSLContext sslContext = SSLContext.getInstance("TLS"); sslContext.init(kmf.getKeyManagers(), tmf.getTrustManagers(), null); ``` 其中,keystore.jks是包含SSL证书的密钥库文件,password是密钥库密码。 2. 配置SslContext ``` SslContext sslCtx = SslContextBuilder.forServer(keyManagerFactory) .trustManager(trustManagerFactory) .build(); ``` 3. 配置WebSocketServerHandler ``` public class WebSocketServerHandler extends SimpleChannelInboundHandler<WebSocketFrame> { private final WebSocketServerHandshaker handshaker; public WebSocketServerHandler(WebSocketServerHandshaker handshaker) { this.handshaker = handshaker; } @Override protected void channelRead0(ChannelHandlerContext ctx, WebSocketFrame frame) throws Exception { // 处理WebSocket消息 } @Override public void channelActive(ChannelHandlerContext ctx) throws Exception { // 握手成功后,建立WebSocket连接 handshaker.handshake(ctx.channel(), new DefaultFullHttpResponse(HttpVersion.HTTP_1_1, HttpResponseStatus.OK)); } @Override public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) throws Exception { // 处理异常 } } ``` 4. 配置WebSocketServerInitializer ``` public class WebSocketServerInitializer extends ChannelInitializer<SocketChannel> { private final SslContext sslCtx; public WebSocketServerInitializer(SslContext sslCtx) { this.sslCtx = sslCtx; } @Override public void initChannel(SocketChannel ch) throws Exception { // 配置ChannelPipeline ChannelPipeline pipeline = ch.pipeline(); pipeline.addLast(new HttpServerCodec()); pipeline.addLast(new HttpObjectAggregator(65536)); pipeline.addLast(new WebSocketServerProtocolHandler("/websocket")); pipeline.addLast(new WebSocketServerHandler(handshaker)); pipeline.addLast(sslCtx.newHandler(ch.alloc())); } } ``` 其中,WebSocketServerProtocolHandlerNetty提供的WebSocket协议处理器,用于处理WebSocket握手和帧。 5. 启动WebSocket服务器 ``` EventLoopGroup bossGroup = new NioEventLoopGroup(); EventLoopGroup workerGroup = new NioEventLoopGroup(); try { ServerBootstrap b = new ServerBootstrap(); b.group(bossGroup, workerGroup) .channel(NioServerSocketChannel.class) .childHandler(new WebSocketServerInitializer(sslCtx)) .option(ChannelOption.SO_BACKLOG, 128) .childOption(ChannelOption.SO_KEEPALIVE, true); ChannelFuture f = b.bind(port).sync(); f.channel().closeFuture().sync(); } finally { workerGroup.shutdownGracefully(); bossGroup.shutdownGracefully(); } ``` 其中,sslCtx是之前创建的SSLContext对象。 以上就是在Netty中配置WebSocket SSL的步骤。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

九师兄

你的鼓励是我做大写作的动力

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

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

打赏作者

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

抵扣说明:

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

余额充值