netty 实现websocket 携带参数建立连接

news/2024/11/30 15:23:51/

Netty提供了很好的WebSocket支持,可以通过添加WebSocketServerProtocolHandler实现暴露一个WebSocket接口。但是,如果需要在WebSocket的URI中添加参数queryString,例如/im/ws?w=221100234&t=99,则连接可能无法建立,浏览器会报错“Connection closed before receiving a handshake response” .

WebSocket协议是基于HTTP协议的,因此可以使用HTTP的参数传递方式来传递WebSocket参数。下面是一些可行的方法:

将参数添加到URI中。可以通过将参数添加到WebSocket URI中来传递参数。例如,如果需要将参数w=221100234&t=99传递给WebSocket服务器,则可以将WebSocket URI设置为ws://localhost:8000/im/ws?w=221100234&t=99。这种方法可以通过WebSocketServerProtocolHandler轻松实现,但是可能会导致连接无法建立 .

将参数添加到HTTP头中。除了将参数添加到URI中,还可以将参数添加到HTTP头中。可以使用WebSocketClientHandshaker类的handshake()方法来指定HTTP头。例如:

WebSocketClientHandshaker handshaker = WebSocketClientHandshakerFactory.newHandshaker(uri, WebSocketVersion.V13, null, true, headers);
ChannelFuture future = bootstrap.connect(uri.getHost(), uri.getPort());
future.syncUninterruptibly();WebSocketClientHandler handler = (WebSocketClientHandler) future.channel().pipeline().last();
handshaker.handshake(future.channel());
handler.handshakeFuture().syncUninterruptibly();

在上面的示例中,headers是一个DefaultHttpHeaders对象,其中包含要添加到HTTP头中的参数。这种方法可以通过WebSocketClientProtocolHandler轻松实现

将参数添加到WebSocket握手处理程序中。还可以将参数添加到WebSocket握手处理程序中。可以使用WebSocketServerProtocolHandler类的handshake()方法来指定WebSocket握手处理程序。例如

ChannelPipeline pipeline = ch.pipeline();
pipeline.addLast(new HttpServerCodec());
pipeline.addLast(new HttpObjectAggregator(65536));
pipeline.addLast(new WebSocketServerCompressionHandler());
pipeline.addLast(new WebSocketServerProtocolHandler("/im/ws", null, true, 65536, true) {@Overridepublic void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception {if (msg instanceof FullHttpRequest) {FullHttpRequest req = (FullHttpRequest) msg;String queryString = req.uri().split("\\?")[1];QueryStringDecoder queryStringDecoder = new QueryStringDecoder(queryString, Charset.forName("UTF-8"));String w = queryStringDecoder.parameters().get("w").get(0);String t = queryStringDecoder.parameters().get("t").get(0);// TODO: handle w and t parameters} else {super.channelRead(ctx, msg);}}
});
pipeline.addLast(new MyWebSocketServerHandler());

在上面的示例中,/im/ws是WebSocket URI的路径,WebSocketServerProtocolHandler的第二个参数为null表示不使用子协议,true表示WebSocket握手处理程序应该负责关闭空闲连接,65536表示WebSocket消息的最大大小,true表示WebSocket握手处理程序应该处理CloseWebSocketFrame .
在实现WebSocket参数传递时,需要注意以下几点:
确保WebSocket URI的格式正确。在将参数添加到WebSocket URI中时,需要确保URI的格式正确。例如,URI应该以ws://或wss://开头,端口号应该在URI中指定。
确保参数名称和值都经过正确的编码。在将参数添加到URI或HTTP头中时,需要确保参数名称和值都经过正确的编码。可以使用URLEncoder类将参数编码为URL编码格式。
确保WebSocket握手处理程序正确处理参数。在将参数添加到WebSocket握手处理程序中时,需要确保处理程序正确地解析和处理参数。可以使用QueryStringDecoder类解码URI中的查询字符串。

在这里插入图片描述
在这里插入图片描述


http://www.ppmy.cn/news/39088.html

相关文章

MySQL学习笔记(十五)——索引的创建和设计原则

1. 为什么使用索引 1.1 不加索引 没有索引,整张表读取数据,然后利用数据来比较条件,捞出符合条件的数据,表有很多数据,这些数据都会通过磁盘IO来读取,很耗时。 1.2 加索引 加索引后 ,通过索引…

Mybatis高阶使用

1.Mybatis拦截器 Mybatis——拦截器Interceptor_mybatis interceptor_七海健人的博客-CSDN博客 mybatis拦截器使用及原理_metaobject.forobject_huang_ma的博客-CSDN博客 手把手教你开发 MyBatis 插件 - 知乎 2.Mybatis工具类 MetaObject MetaClass https://www.cnblogs.co…

leetcode 面试题 17.06. 2出现的次数

编写一个方法,计算从 0 到 n (含 n) 中数字 2 出现的次数。 示例: 输入: 25 输出: 9 解释: (2, 12, 20, 21, 22, 23, 24, 25)(注意 22 应该算作两次) 该问题用的方法数数组dp,首先我通过总结规律写出了相关的code。使用一个dp数组记录10i10^i10i以内会出…

加多宝二次创业五周年:解锁品牌持续增长密码

今年作为后疫情时代元年,首要的任务是提振经济、重振信心,其中消费市场的提振至关重要。 春江水暖鸭先知。每当消费市场开始复苏,食品饮料行业的回暖一般会更明显。而要扩大食品饮料的消费规模、提振消费信心,关键在于品牌结合外…

NVIDIA jetson tensorrt加速yolov5摄像头检测

link 在使用摄像头直接检测目标时,检测的实时画面还是有点慢,下面是tensorrt加速过程记录。 一、设备 1、设备jetson agx xavier 2、jetpack4.6.1 3、tensorrt 8.2.1.8 4、conda虚拟环境 python3.6 二、虚拟环境搭建及依赖 1、参考此博客安装torch Nvidi…

13回归网络:HTTP/2是怎样的网络协议?

本篇文章我们先放下实践,回归网络,深入gRPC底层的HTTP/2协议,去探究一下框架底层网络协议的原理,提升对高性能网络协议的认知,相信读完这篇文章以后,我们就可以了解HTTP/2有哪些优势,为什么gRPC要使用HTTP/2作为底层的传输协议。 在众多研究HTTP/2的博客和资料中,最具…

银行数字化转型导师坚鹏:数字化转型背景下的银行对公客户营销

数字化转型背景下的银行对公客户营销课程背景: 数字化转型背景下,很多银行存在以下问题:不清楚如何搭建金融场景?不知道如何挖掘客户需求?不知道如何开展数字化营销? 课程特色:有实战案…

线程的定时器问题

文章目录前言一.定时器二.定时器的具体实现和原理2.1 定时器的主要构成部分2.2 定时器的各个功能的实现任务对象任务队列定时器线程定时器线程出现的问题三.全部代码前言 多线程的定时器是一种在多线程环境下实现定时任务的技术。它能够让多个线程在指定的时间点执行特定的任务…