范文健康探索娱乐情感热点
热点动态
科技财经
情感日志
励志美文
娱乐时尚
游戏搞笑
探索旅游
历史星座
健康养生
美丽育儿
范文作文
教案论文

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

  简介
  在网速快速提升的时代,浏览器已经成为我们访问各种服务的入口,很难想象如果离开了浏览器,我们的网络世界应该如何运作。现在恨不得把操作系统都搬上浏览器。但是并不是所有的应用都需要浏览器来执行,比如服务器和服务器之间的通信,就需要使用到自建客户端来和服务器进行交互。
  本文将会介绍使用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/
  最通俗的解读,最深刻的干货,最简洁的教程,众多你不知道的小技巧等你来发现!
  欢迎关注我的公众号:「程序那些事」,懂技术,更懂你!

亚马逊侵权病因自己!泽宝再出大招!广东省培育200个亿级卖家一周的工作按下了暂停键,我们为卖家朋友们盘点了本周比较重要的10大要闻,为我们跨境电商的大时代留下一个个小坐标。平台1。亚马逊100多条热门listing变不可售,再爆审核bug点两只独角兽走到一起互联网医疗进入深水区互联网医疗领域的两家独角兽级别的企业走到了一起。第一财经记者从医联集团处确认,该公司已经整合未来医生。两者最新一轮融资后的估值分别达40亿美元和10亿美元,这也是数年来互联网医疗领马云的无人超市怎么没人提了?2017年夏天,和气温一样热度上升的马云无人超市一下子吸引了互联网创投们的眼球,客户进店,选购,结账全自助,店内无一个店员。无人超市一下子颠覆了传统超市,物联网新零售横空出世。代表break语句与continue语句一break语句如果要退出while循环,不再运行循环中余下的代码,也不管条件测试的结果如何,可以使用break语句。二continue语句如果要返回到while循环开头,并根据条升级传统,超越传统,小米智能插线板2为生活加分随着我们的生活不断发展和提高,对生活的舒适性提升就催生了智能家居的快速发展,但是毕竟家电还是家居装修,都不是如同电子产品那样家庭迭代俺么快的,所以,一些辅助型的智能家居好物就有了市十四五新型基础设施建设专家谈之六推进融合基础设施与信息基础设施协同发展信息基础设施和融合基础设施是十四五新型基础设施建设的两个重点方向,融合基础设施是信息基础设施发展的拓展和延伸,信息基础设施是融合基础设施发展的动力和支撑。两者相互作用相互促进,需要工业3D视觉,为智能制造打开新视界1969年,第一片CCD图像传感器在美国贝尔实验室诞生,它为数字影像产业的发展打开了一扇新的大门。从此,人们的日常生活生产都与影像视觉相联系。机器视觉的世界也在萌芽,从黑白到彩色,家具企业发展数字工厂智能制造,可以从这3个方面去考虑家具市场竞争进入白热化,面对原材料劳动力成本上升节能减排等问题,家具企业转型升级的压力倍增。而随着智能制造大数据成为各大制造企业关注的热点,未来制造业的发展方向和雏形正在逐渐形成,医疗信息服务将成为阿里搜索领域重要战略北京商报讯(记者何倩)12月14日,据夸克App与中国传媒大学互联网信息研究院联合发布的中国Z世代智能信息全域研究报告显示,建党百年奥运会中国航天备考青年破防YYDS疫苗接种等成为2022如何投资基金?如果能准确跑进赛道,恭喜你,随时可以毕业回家过年,跑错赛道,那你有可能得坚持跑一年!先汇总一下,明年看好的是半导体军工新能源板块。这几类板块成长性最好。其次是大消费板块和医疗。半导教程20国产编程语言CbrotherByteArray字节操作ByteArray类CBrother提供了ByteArray类来处理字节流varmyBytenewByteArray(102410)创建一个10KB的缓冲varmyByte2new
2022年2月电脑配置推荐单新年新气象,矿难何时来。新年已过,年前发布的3050不出所料同样涨价。官方定价1899现在基本到了2500左右,涨幅度还是相当高的。还是老话,非刚需不建议入手,实在需要可以去看看正Android13DP1曝光谷歌Pixel7和Pixel7Pro的代号据9to5Google报道,Android13DP1的发布揭示了一些关于谷歌新芯片的进一步信息。去年,有人发现了代号为Cloudropper的下一代Tensor芯片,其型号为GS2打印机共享在实际维修中,遇到打印机共享的问题很多,正好有时间可以写一下工作中的操作。打印机共享之前,首先要确定一下所有电脑都在一个工作组。首先查看工作组方法在桌面上选计算机点右键属性,就能看12代酷睿刚热乎,13代又要来了,英特尔怎么不挤牙膏了?目前12代酷睿全家桶才上线不久,13代的RaptorLake就要来了,依然采用了12代相同的大小核设计和Intel7工艺,多达8大12小混合内核架构,带来的绝对是性能上的暴涨!Ra30例一文搞懂python日期时间处理本文介绍了datetime模块中datetime类的各种方法和属性,代码案例丰富,分门别类,方便使用时查找。前言datetime是python的内置模块,用来处理日期和时间。该模块终于找到一款能全天候佩戴的耳机索尼LinkBuds上手测评请问小伙伴们,有没人觉得长时间戴入耳式耳机会耳朵疼?虽然半入耳的耳机佩戴感会好些,但总归是松松垮垮的容易脱落,在降噪运动等场景效果并不是很好。索尼发布了一款堪称全新形态的耳机产品L2022数字中国创新大赛将设十大赛道紧追信息技术发展热点中新网福州2月18日电(记者王东明)记者18日从2022数字中国创新大赛组委会了解到,2022年数字中国创新大赛将设立十大赛道,并将在第五届数字中国建设峰会期间举办总决赛和颁奖仪式二氧化碳转化为可利用的物质,或许能够停止全球变暖,实现碳中和随着人类科技的不断发展,环境问题被越来越多的人提起,基本上每年,科学家都会对这个问题发出警示。即使没有科学家发出的警示,我们也可以从身边的环境变化,看到地球的生态变得越来越糟糕。地身价百亿的华为二公主为何要进娱乐圈?难道姚安娜另有隐情?众所周知,华为手机二公主姚安娜已经出道一年有余了,娱乐新闻中确实露面的机会不多,那就有客官问了,放着好好的富家千金不当为何来趟娱乐圈的水?这其中难道另有隐情?今天我们就来从商业的角中国拿禁诉令保护华为?欧盟告上WTO,威胁对华采取报复措施短短一个月内,欧盟两次将中国告上WTO。一次是1月初,欧盟要为立陶宛出头,起诉中国对立陶宛进行所谓的经济胁迫。而这次,欧盟则是表示要状告中国禁诉令损害了欧盟企业。欧盟执委会表示,中首批新能源汽车电池迎来退役潮3万次循环寿命的格力钛电池技术或成颠覆式技术随着我国新能源汽车保有量的快速增长,动力电池的退役量也在逐步攀升,进入2022年,第一批投入市场的动力电池迎来了退休浪潮。据中国汽车技术研究中心数据显示,截至2020年,国内累计退