netty系列之使用netty搭建websocket客户端
简介
在网速快速提升的时代,浏览器已经成为我们访问各种服务的入口,很难想象如果离开了浏览器,我们的网络世界应该如何运作。现在恨不得把操作系统都搬上浏览器。但是并不是所有的应用都需要浏览器来执行,比如服务器和服务器之间的通信,就需要使用到自建客户端来和服务器进行交互。
本文将会介绍使用netty客户端连接websocket的原理和具体实现。浏览器客户端
在介绍netty客户端之前,我们先看一个简单的浏览器客户端连接websocket的例子:创建连接constsocketnewWebSocket(ws:localhost:8000);开启连接socket。addEventListener(open,function(event){socket。send(没错,开启了!);});监听消息socket。addEventListener(message,function(event){console。log(监听到服务器的消息,event。data);});
这里使用了浏览器最通用的语言javascript,并使用了浏览器提供的websocketAPI进行操作,非常的简单。
那么用netty客户端实现websocket的连接是否和javascript使用一样呢?我们一起来探索。netty对websocket客户端的支持
先看看netty对websocket的支持类都有哪些,接着我们看下怎么具体去使用这些工具类。WebSocketClientHandshaker
和websocketserver一样,client中最核心的类也是handshaker,这里叫做WebSocketClientHandshaker。这个类有什么作用呢?一起来看看。
这个类主要实现的就是client和server端之间的握手。
我们看一下它的最长参数的构造类:protectedWebSocketClientHandshaker(URIuri,WebSocketVersionversion,Stringsubprotocol,HttpHeaderscustomHeaders,intmaxFramePayloadLength,longforceCloseTimeoutMillis,booleanabsoluteUpgradeUrl)
参数中有websocket连接的URI,像是:ws:flydean。commypath。
有请求子协议的类型subprotocol,有自定义的HTTPheaders:customHeaders,有最大的framepayload的长度:maxFramePayloadLength,有强制timeout关闭的时间,有使用HTTP协议进行升级的URI地址。
怎么创建handshaker呢?同样的,netty提供了一个WebSocketClientHandshakerFactory方法。
WebSocketClientHandshakerFactory提供了一个newHandshaker方法,可以方便的创建各种不同版本的handshaker:if(versionV13){returnnewWebSocketClientHandshaker13(webSocketURL,V13,subprotocol,allowExtensions,customHeaders,maxFramePayloadLength,performMasking,allowMaskMismatch,forceCloseTimeoutMillis);}if(versionV08){returnnewWebSocketClientHandshaker08(webSocketURL,V08,subprotocol,allowExtensions,customHeaders,maxFramePayloadLength,performMasking,allowMaskMismatch,forceCloseTimeoutMillis);}if(versionV07){returnnewWebSocketClientHandshaker07(webSocketURL,V07,subprotocol,allowExtensions,customHeaders,maxFramePayloadLength,performMasking,allowMaskMismatch,forceCloseTimeoutMillis);}if(versionV00){returnnewWebSocketClientHandshaker00(webSocketURL,V00,subprotocol,customHeaders,maxFramePayloadLength,forceCloseTimeoutMillis);}
可以看到,根据传入协议版本的不同,可以分为WebSocketClientHandshaker13、WebSocketClientHandshaker08、WebSocketClientHandshaker07、WebSocketClientHandshaker00这几种。WebSocketClientCompressionHandler
通常来说,对于webSocket协议,为了提升传输的性能和速度,降低网络带宽占用量,在使用过程中通常会带上额外的压缩扩展。为了处理这样的压缩扩展,netty同时提供了服务器端和客户端的支持。
对于服务器端来说对应的handler叫做WebSocketServerCompressionHandler,对于客户端来说对应的handler叫做WebSocketClientCompressionHandler。
通过将这两个handler加入对应pipline中,可以实现对websocket中压缩协议扩展的支持。
对于协议的扩展有两个级别分别是permessagedeflate和perframedeflate,分别对应PerMessageDeflateClientExtensionHandshaker和DeflateFrameClientExtensionHandshaker。
至于具体怎么压缩的,这里就不详细进行讲解了,感兴趣的小伙伴可以自行了解。netty客户端的处理流程
前面讲解了netty对websocket客户端的支持之后,本节将会讲解netty到底是如何使用这些工具进行消息处理的。
首先是按照正常的逻辑创建客户端的Bootstrap,并添加handler。这里的handler就是专门为websocket定制的client端handler。
除了上面提到的WebSocketClientCompressionHandler,就是自定义的handler了。
在自定义handler中,我们需要处理两件事情,一件事情就是在channelready的时候创建handshaker。另外一件事情就是具体websocket消息的处理了。创建handshaker
首先使用WebSocketClientHandshakerFactory创建handler:TestSocketClientHandlerhandlernewTestSocketClientHandler(WebSocketClientHandshakerFactory。newHandshaker(uri,WebSocketVersion。V13,null,true,newDefaultHttpHeaders()));
然后在channelactive的时候使用handshaker进行握手连接:publicvoidchannelActive(ChannelHandlerContextctx){handshaker。handshake(ctx。channel());}
然后在进行消息接收处理的时候还需要判断handshaker的状态是否完成,如果未完成则调用handshaker。finishHandshake方法进行手动完成:if(!handshaker。isHandshakeComplete()){try{handshaker。finishHandshake(ch,(FullHttpResponse)msg);log。info(websocketHandshake完成!);handshakeFuture。setSuccess();}catch(WebSocketHandshakeExceptione){log。info(websocket连接失败!);handshakeFuture。setFailure(e);}return;}
当handshake完成之后,就可以进行正常的websocket消息读写操作了。websocket消息的处理
websocket的消息处理比较简单,将接收到的消息转换成为WebSocketFrame进行处理即可。WebSocketFrameframe(WebSocketFrame)msg;if(frameinstanceofTextWebSocketFrame){TextWebSocketFrametextFrame(TextWebSocketFrame)frame;log。info(接收到TXT消息:textFrame。text());}elseif(frameinstanceofPongWebSocketFrame){log。info(接收到pong消息);}elseif(frameinstanceofCloseWebSocketFrame){log。info(接收到closing消息);ch。close();}总结
本文讲解了netty提供的websocket客户端的支持和具体的对接流程,大家可以再次基础上进行扩展,以实现自己的业务逻辑。
本文的例子可以参考:learnnetty4本文已收录于http:www。flydean。com25nettywebsocketclient
最通俗的解读,最深刻的干货,最简洁的教程,众多你不知道的小技巧等你来发现!
欢迎关注我的公众号:程序那些事,懂技术,更懂你!
元宇宙火了?有人10天收入160万元,是风口还是虎口?我认为是虎口,普通人不要参与。元宇宙(Metaverseicon)是一个虚拟时空间的集合,由一系列的增强现实(AR)、虚拟现实(VR)和互联网(Internet)所组成。……
独家阿里内部新增员工关怀制度曝光,推7天全薪陪伴假新京报贝壳财经讯(记者程子姣)12月14日,新京报贝壳财经记者从阿里巴巴内部获悉,今日阿里巴巴在内网公布了多项针对员工关怀的暖心计划,包含多项员工福利升级除率先响应国家号召延长……
新颐小白pro空气净化器除甲醛效果怎么样?净化效果挺好的,某机构曾对市面上包括新颐小白PRO等31款空气净化器进行了横评,经过广州市微生物研究所等第三方专业检测机构检测,发现个别产品标称值与实测值偏差过大,存在虚标现象……
苹果混合现实头显将专注三大功能财经网科技12月6日讯,据新浪科技消息,苹果增强现实和虚拟现实头显设备将专注于游戏、媒体消费和沟通交流。格曼经常精确披露苹果计划的相关信息,他阐述了用户可以期待苹果的增强……
TCL98巨幕大屏已收到!大屏电视只选TCL,这个售后服务真我本身也是一位女性,所以我对家电产品的话我是希望越方便越好,我入手的是这款机型是TCL98Q6E,TCL的专业师傅确实让我省了很多事情,下单后会有专门的售后给我打电话约我有空的……
买红米K50还是iPhoneSE3?不吹不黑,分析各自优缺后今年三月份,手机圈可谓百花争艳,为了抢占市场空间,主流手机厂商都在争先恐后地发布自家的旗舰手机。红米、荣耀、苹果、OPPO都不例外。在新品批量涌现的情况下,某些厂商似乎顶不住市……
挣脱吸血的信息茧房才能消除算法霸权日前,中国青年报社社会调查中心联合问卷网,对1144名受访者进行的一项调查显示,75。3的受访者曾被算法推荐服务困扰过。56。1的受访者关注《互联网信息服务算法推荐管理规定》。……
1nm芯片有望?台积电接连传来两个消息,证实任正非的决策是对了解更多科技资讯尽在圈聊科技。今天跟大家聊一聊:1nm芯片有望了?台积电接连传来两个消息,都证实任正非决策是对的!在全球进入到全面的缺芯状态之后,各个半导体企业面对……
如何注销手机号?谢谢邀请,由于具体业务内容有差异,请先通过当时办业务时的地方的热线咨询清楚,问清楚后再去营业厅办理。因为有可能需要机主走下注销流程,有的它也不需要,没什么影响,前提是必须问清楚……
21新出行丨滴滴将与广汽埃安共同研发无人驾驶新能源车型5月17日,广汽埃安新能源汽车有限公司(以下简称广汽埃安)宣布与滴滴旗下自动驾驶公司达成战略合作,双方将开发一款可投入规模化应用的无人驾驶新能源车型,并全速推进量产。据悉……
浅谈风控的架构其实不同行业,不同领域的风控还是有很大区别的,这里只针对典型刷量,刷榜,不当获利等类型的网络行为,进行风控体系的一些基本架构。当然,时代与时俱进,有些新的思路可能已经超出……
在微粒贷借钱可靠吗?很多人都知道,微信微粒到的出现就是一个奇迹,奇迹的让微信亿万用户无语,因为很多用户只是听说微粒贷,却一直无法体验。众所周知,微信是看到支付宝借呗、花呗在互联网金融领域祛痘……