网易首页 > 网易号 > 正文 申请入驻

netty系列之:使用netty搭建websocket客户端

0
分享至

简介

在网速快速提升的时代,浏览器已经成为我们访问各种服务的入口,很难想象如果离开了浏览器,我们的网络世界应该如何运作。现在恨不得把操作系统都搬上浏览器。但是并不是所有的应用都需要浏览器来执行,比如服务器和服务器之间的通信,就需要使用到自建客户端来和服务器进行交互。

本文将会介绍使用netty客户端连接websocket的原理和具体实现。

浏览器客户端

在介绍netty客户端之前,我们先看一个简单的浏览器客户端连接websocket的例子:

// 创建连接
const socket = new WebSocket('ws://localhost:8000');

// 开启连接
socket.addEventListener('open', function (event) {
socket.send('没错,开启了!');
});

// 监听消息
socket.addEventListener('message', function (event) {
console.log('监听到服务器的消息 ', event.data);
});

这里使用了浏览器最通用的语言javascript,并使用了浏览器提供的websocket API进行操作,非常的简单。

那么用netty客户端实现websocket的连接是否和javascript使用一样呢?我们一起来探索。

netty对websocket客户端的支持

先看看netty对websocket的支持类都有哪些,接着我们看下怎么具体去使用这些工具类。

WebSocketClientHandshaker

和websocket server一样,client中最核心的类也是handshaker,这里叫做WebSocketClientHandshaker。这个类有什么作用呢?一起来看看。

这个类主要实现的就是client和server端之间的握手。

我们看一下它的最长参数的构造类:

protected WebSocketClientHandshaker(URI uri, WebSocketVersion version, String subprotocol,
HttpHeaders customHeaders, int maxFramePayloadLength,
long forceCloseTimeoutMillis, boolean absoluteUpgradeUrl)

参数中有websocket连接的URI,像是:”ws://flydean.com/mypath”。

有请求子协议的类型subprotocol,有自定义的HTTP headers:customHeaders,有最大的frame payload的长度:maxFramePayloadLength,有强制timeout关闭的时间,有使用HTTP协议进行升级的URI地址。

怎么创建handshaker呢?同样的,netty提供了一个WebSocketClientHandshakerFactory方法。

WebSocketClientHandshakerFactory提供了一个newHandshaker方法,可以方便的创建各种不同版本的handshaker:

if (version == V13) {
return new WebSocketClientHandshaker13(
webSocketURL, V13, subprotocol, allowExtensions, customHeaders,
maxFramePayloadLength, performMasking, allowMaskMismatch, forceCloseTimeoutMillis);
}
if (version == V08) {
return new WebSocketClientHandshaker08(
webSocketURL, V08, subprotocol, allowExtensions, customHeaders,
maxFramePayloadLength, performMasking, allowMaskMismatch, forceCloseTimeoutMillis);
}
if (version == V07) {
return new WebSocketClientHandshaker07(
webSocketURL, V07, subprotocol, allowExtensions, customHeaders,
maxFramePayloadLength, performMasking, allowMaskMismatch, forceCloseTimeoutMillis);
}
if (version == V00) {
return new WebSocketClientHandshaker00(
webSocketURL, V00, subprotocol, customHeaders, maxFramePayloadLength, forceCloseTimeoutMillis);
}

可以看到,根据传入协议版本的不同,可以分为WebSocketClientHandshaker13、WebSocketClientHandshaker08、WebSocketClientHandshaker07、WebSocketClientHandshaker00这几种。

WebSocketClientCompressionHandler

通常来说,对于webSocket协议,为了提升传输的性能和速度,降低网络带宽占用量,在使用过程中通常会带上额外的压缩扩展。为了处理这样的压缩扩展,netty同时提供了服务器端和客户端的支持。

对于服务器端来说对应的handler叫做WebSocketServerCompressionHandler,对于客户端来说对应的handler叫做WebSocketClientCompressionHandler。

通过将这两个handler加入对应pipline中,可以实现对websocket中压缩协议扩展的支持。

对于协议的扩展有两个级别分别是permessage-deflate和perframe-deflate,分别对应PerMessageDeflateClientExtensionHandshaker和DeflateFrameClientExtensionHandshaker。

至于具体怎么压缩的,这里就不详细进行讲解了, 感兴趣的小伙伴可以自行了解。

netty客户端的处理流程

前面讲解了netty对websocket客户端的支持之后,本节将会讲解netty到底是如何使用这些工具进行消息处理的。

首先是按照正常的逻辑创建客户端的Bootstrap,并添加handler。这里的handler就是专门为websocket定制的client端handler。

除了上面提到的WebSocketClientCompressionHandler,就是自定义的handler了。

在自定义handler中,我们需要处理两件事情,一件事情就是在channel ready的时候创建handshaker。另外一件事情就是具体websocket消息的处理了。

创建handshaker

首先使用WebSocketClientHandshakerFactory创建handler:

TestSocketClientHandler handler =
new TestSocketClientHandler(
WebSocketClientHandshakerFactory.newHandshaker(
uri, WebSocketVersion.V13, null, true, new DefaultHttpHeaders()));

然后在channel active的时候使用handshaker进行握手连接:

public void channelActive(ChannelHandlerContext ctx) {
handshaker.handshake(ctx.channel());
}

然后在进行消息接收处理的时候还需要判断handshaker的状态是否完成,如果未完成则调用handshaker.finishHandshake方法进行手动完成:

if (!handshaker.isHandshakeComplete()) {
try {
handshaker.finishHandshake(ch, (FullHttpResponse) msg);
log.info("websocket Handshake 完成!");
handshakeFuture.setSuccess();
} catch (WebSocketHandshakeException e) {
log.info("websocket连接失败!");
handshakeFuture.setFailure(e);
}
return;
}

当handshake完成之后,就可以进行正常的websocket消息读写操作了。

websocket消息的处理

websocket的消息处理比较简单,将接收到的消息转换成为WebSocketFrame进行处理即可。

WebSocketFrame frame = (WebSocketFrame) msg;
if (frame instanceof TextWebSocketFrame) {
TextWebSocketFrame textFrame = (TextWebSocketFrame) frame;
log.info("接收到TXT消息: " + textFrame.text());
} else if (frame instanceof PongWebSocketFrame) {
log.info("接收到pong消息");
} else if (frame instanceof CloseWebSocketFrame) {
log.info("接收到closing消息");
ch.close();
}
总结

本文讲解了netty提供的websocket客户端的支持和具体的对接流程,大家可以再次基础上进行扩展,以实现自己的业务逻辑。

本文的例子可以参考:learn-netty4

本文已收录于 http://www.flydean.com/25-netty-websocket-client/

特别声明:以上内容(如有图片或视频亦包括在内)为自媒体平台“网易号”用户上传并发布,本平台仅提供信息存储服务。

Notice: The content above (including the pictures and videos if any) is uploaded and posted by a user of NetEase Hao, which is a social media platform and only provides information storage services.

相关推荐
热点推荐
利物浦领跑5000万镑新星争夺战 曼联紧追不舍

利物浦领跑5000万镑新星争夺战 曼联紧追不舍

甜度百分百21
2026-05-18 02:19:16
陈思成哭晕!佟丽娅新恋情,离婚5年后男友被公开,有镜头立马甩开手

陈思成哭晕!佟丽娅新恋情,离婚5年后男友被公开,有镜头立马甩开手

八卦王者
2026-05-15 15:56:31
你会爱我吗:不是问你,是问我自己

你会爱我吗:不是问你,是问我自己

疾跑的小蜗牛
2026-05-17 20:14:06
二十家A股上市公司本周披露并购重组最新公告 金海高科控股股东、实际控制人拟变更为金丹良

二十家A股上市公司本周披露并购重组最新公告 金海高科控股股东、实际控制人拟变更为金丹良

财联社
2026-05-17 19:54:05
“余生好好走”,知名央视主持人王小丫,病床上的留言字字催泪

“余生好好走”,知名央视主持人王小丫,病床上的留言字字催泪

近史谈
2026-03-31 18:57:49
AI医疗彻底火了!千亿独角兽拿下全美65%医生,OpenAI、阿里已全面跟进!

AI医疗彻底火了!千亿独角兽拿下全美65%医生,OpenAI、阿里已全面跟进!

智药局
2026-05-17 18:51:18
1-0,英超第14掀翻英超第7,第96分钟读秒绝杀,勒温一剑封喉

1-0,英超第14掀翻英超第7,第96分钟读秒绝杀,勒温一剑封喉

凌空倒钩
2026-05-18 00:16:58
文脉华章|让文物 “活” 起来,解锁内蒙古数字文博里的精彩中国

文脉华章|让文物 “活” 起来,解锁内蒙古数字文博里的精彩中国

国际在线
2026-05-17 20:33:01
亚马尔谈身体状况:世界杯之前我都不会碰球

亚马尔谈身体状况:世界杯之前我都不会碰球

懂球帝
2026-05-18 00:37:12
酒店晒证据实锤,换装新娘另有目的!宾客是冤大头,不走就得被割

酒店晒证据实锤,换装新娘另有目的!宾客是冤大头,不走就得被割

奇思妙想草叶君
2026-05-17 19:57:27
离开鲍春来情定他人,婚后儿女绕膝,如今变身北外高颜值老师

离开鲍春来情定他人,婚后儿女绕膝,如今变身北外高颜值老师

流云随风去远方
2026-05-18 01:59:16
阿森纳球迷集体泪目!等了整整十年!终于有望签下世界最佳了!

阿森纳球迷集体泪目!等了整整十年!终于有望签下世界最佳了!

澜归序
2026-05-17 01:59:31
黄仁勋在上海张江落脚了,80米高,造型有点意思啊!

黄仁勋在上海张江落脚了,80米高,造型有点意思啊!

GA环球建筑
2026-05-18 00:05:24
墓碑上的“故、显、先、考、妣”,指的是什么?看完长知识了​​

墓碑上的“故、显、先、考、妣”,指的是什么?看完长知识了​​

历史人文2
2026-05-16 12:00:03
台湾回归终极方案:土地回归中国,人员自由往来,两岸统一新路径

台湾回归终极方案:土地回归中国,人员自由往来,两岸统一新路径

陈腕特色体育解说
2026-05-17 21:12:19
爆笑了!曾卓君忘报名拳皇15比赛 发文求官方给个机会

爆笑了!曾卓君忘报名拳皇15比赛 发文求官方给个机会

游民星空
2026-05-17 12:44:15
女生主动起来有多黏人?网友:这些女的太开放了

女生主动起来有多黏人?网友:这些女的太开放了

带你感受人间冷暖
2026-01-27 00:20:06
特朗普刚访华,美媒察觉不对:最强歼20已部署,解放军剑指台海

特朗普刚访华,美媒察觉不对:最强歼20已部署,解放军剑指台海

时光流转追梦人
2026-05-17 02:41:07
伊朗议长卡利巴夫被任命为对华事务特别代表

伊朗议长卡利巴夫被任命为对华事务特别代表

新华社
2026-05-17 17:03:24
国米无人可在“三冠王”那支队踢球?穆帅发言引争议,齐沃怎么想

国米无人可在“三冠王”那支队踢球?穆帅发言引争议,齐沃怎么想

里芃芃体育
2026-05-18 03:00:06
2026-05-18 03:23:00
flydean程序那些事
flydean程序那些事
最通俗的解读,最深刻的干货!
356文章数 438关注度
往期回顾 全部

科技要闻

三大运营商即将免月租?多方回应

头条要闻

内塔尼亚胡与特朗普通话 讨论重启对伊朗军事打击

头条要闻

内塔尼亚胡与特朗普通话 讨论重启对伊朗军事打击

体育要闻

生死战只拿3分的核心,还有留的必要吗?

娱乐要闻

卢昱晓道歉:认识到问题严重性!

财经要闻

长鑫科技 预计上半年净利至少500亿元

汽车要闻

车长超5米/双动力可选 昊铂S600预售权益价18.89万起

态度原创

家居
房产
游戏
公开课
军事航空

家居要闻

110㎡淡而有致的生活表达

房产要闻

老黄埔热销之下,珠江春,为何去化仅3成?

直到世界的尽头!《文明7》即将免费更新传奇征服者

公开课

李玫瑾:为什么性格比能力更重要?

军事要闻

黎以停火再延长 空袭却未停止

无障碍浏览 进入关怀版