您当前的位置:首页 > 电脑百科 > 网络技术 > 网络技术

webSocket的netty实现

时间:2022-09-12 13:48:47  来源:  作者:一个程序员小哥哥

websokct 使用.NETty 实现

websocket 是一个全双工的长连接通讯

话不多说直接上代码。。

服务端的代码实现

public void init() throws InterruptedException {
        EventLoopGroup boosGroup = new NioEventLoopGroup();
        EventLoopGroup workGroup = new NioEventLoopGroup();

        try {
            ServerBootstrap serverBootstrap = new ServerBootstrap();
            serverBootstrap.group(boosGroup, workGroup).channel(NIOServerSocketChannel.class)
                    .handler(new LoggingHandler(LogLevel.INFO))
                    .childHandler(new ChannelInitializer<SocketChannel>() {

                        @Override
                        protected void initChannel(SocketChannel ch) {
                            ChannelPipeline pipeline = ch.pipeline();
                            // http 编码和解编码 handler
                            pipeline.addLast(new HttpServerCodec());
                            // chunked 以块的形式 handler
                            pipeline.addLast(new ChunkedWriteHandler());
                            // http 数据传输过程中是分段的, httpObjectAggregator 就可以给多个段做聚合操作,这就是浏览器发送大量数据时候,就会发出多次 http 请求
                            pipeline.addLast(new HttpObjectAggregator(8192));
                            // webSocket 是通过帧的形式传递的,可以看到 WebSocketFrame 六个子类,WebSocketServerProtocolHandler 他的主要功能就是可以把 http 协议升级为 ws 协议,保持长连接
                            pipeline.addLast(new WebSocketServerProtocolHandler("/msg"));
                            pipeline.addLast(new CustomWebSocketFrameTextHandler());
                        }
                    });
            ChannelFuture channelFuture = serverBootstrap.bind(88).sync();
            channelFuture.addListener(future -> {
                if (future.isDone()) log.info("端口绑定成功");
            });
            channelFuture.channel().closeFuture().sync();
        } finally {
            boosGroup.shutdownGracefully();
            workGroup.shutdownGracefully();
        }
    }

服务端的逻辑会用到自定义handler的处理器
CustomWebSocketFrameTextHandler 这个自定义处理器。

处理器的代码

/**
     * 这里的 {@link TextWebSocketFrame} 表示一个文本帧
     *
     * @author L
     */
    class CustomWebSocketFrameTextHandler extends SimpleChannelInboundHandler<TextWebSocketFrame> {

        Logger log = LoggerUtils.getLogger(CustomWebSocketFrameTextHandler.class);

        /**
         * 当 web 客户端连接以后就会触发这个方法
         */
        @Override
        public void handlerAdded(ChannelHandlerContext ctx) {
            // id 表示唯一的值信息,LongText 是唯一的。ShortText 不是唯一的
            log.info("handlerAdded => {} 被调用", ctx.channel().id().asLongText());
            log.info("handlerAdded => {} 被调用", ctx.channel().id().asShortText());
        }

        @Override
        protected void channelRead0(ChannelHandlerContext ctx, TextWebSocketFrame msg) {
            String text = msg.text();
            log.info("{}", text);
            // 回复客户端消息
            ctx.writeAndFlush(new TextWebSocketFrame(text));
        }

        /**
         * 断开连接以后会触发
         */
        @Override
        public void handlerRemoved(ChannelHandlerContext ctx) {
            log.info("handlerRemoved => {} 被调用", ctx.channel().id().asLongText());
        }

        @Override
        public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) {
            log.error("发生异常 => {}", cause.getMessage());
        }
    }

服务端这就可以运行了。然后需要一个客户端来测试。客户端需要直接编写一个 html 的简单的小页面来测试。

let webSocket = null;

    if (window.WebSocket) {
        // 逻辑
        webSocket = new WebSocket("ws://localhost:88/msg");
        webSocket.onopen = () => {
            let showPlace = document.getElementById("responseMessage");
            showPlace.value = "连接开启";
        }
        webSocket.onmessage = function (p) {
            let showPlace = document.getElementById("responseMessage");
            showPlace.value = showPlace.value + "rn" + p.data;
        }
        webSocket.onclose = () => {
            let showPlace = document.getElementById("responseMessage");
            showPlace.value = showPlace.value + "rn" + "连接关闭";
        }
        webSocket.onerror = (p) => {
            let showPlace = document.getElementById("responseMessage");
            showPlace.value = showPlace.value + "rn" + "连接错误 => " + p.type;
        }
    } else alert("当前浏览器不支持操作");

    function send(msg) {
        if (webSocket.OPEN) {
            webSocket.send(msg);
        }
    }

这样就实现了 netty的 websocket 服务



Tags:webSocket   点击:()  评论:()
声明:本站部分内容及图片来自互联网,转载是出于传递更多信息之目的,内容观点仅代表作者本人,如有任何标注错误或版权侵犯请与我们联系(Email:2595517585@qq.com),我们将及时更正、删除,谢谢。
▌相关推荐
前导近期有个同事跟我说遇到一件很奇怪的事情,时不时收到售后反馈说 部分用户无法接收到聊天室(WebSocket 服务)消息,然而在测试服以各种方式测试都无法复现这种现象。于是陷...【详细内容】
2022-10-21  Tags: webSocket  点击:(14)  评论:(0)  加入收藏
日常开发中我们出于保证连接的稳定性的目的,将应用拆分成了「主进程」和「通讯进程」,并为二者定义了相互通信的接口。即便如此,我们也只是实现了客户端一侧的进程间通信,而要实...【详细内容】
2022-10-20  Tags: webSocket  点击:(11)  评论:(0)  加入收藏
关于NettyNetty 是一个利用 Java 的高级网络的能力,隐藏其背后的复杂性而提供一个易于使用的 API 的客户端/服务器框架。MAVEN依赖 <dependencies> <!-- https://mvnrepos...【详细内容】
2022-09-27  Tags: webSocket  点击:(27)  评论:(0)  加入收藏
websokct 使用 netty 实现websocket 是一个全双工的长连接通讯话不多说直接上代码。。服务端的代码实现public void init() throws InterruptedException { EventLoo...【详细内容】
2022-09-12  Tags: webSocket  点击:(50)  评论:(0)  加入收藏
upstream websocket {#ip_hash;server ivcp-api.ttt.com;}#For WebSocket define serverserver {listen 9999;server_name localhost;location / {proxy_pass http://ivcp-a...【详细内容】
2022-03-18  Tags: webSocket  点击:(369)  评论:(0)  加入收藏
第一次看到 ws:// 和 wss:// 时候,感觉好高级啊,还有这种协议。Websocket 历史WebSocket是在2008年6月诞生的1。经由IEFT标准化后,2009年chrome 4第一个提供了该标准支持,并默认...【详细内容】
2022-03-17  Tags: webSocket  点击:(98)  评论:(0)  加入收藏
一、这一大堆关键词之间到底有啥区别?有名字就有定义,理解的前提从来都是对定义有所了解。就好比现在让你形容一下梯形的定义,如果你不知道定义,你就可能把平行四边形当做特殊...【详细内容】
2022-02-25  Tags: webSocket  点击:(155)  评论:(0)  加入收藏
WebSocket是HTML5出的东西(协议),也就是说HTTP协议没有变化,或者说没关系,但HTTP是不支持持久连接的(长连接,循环连接得不算)首先HTML5 是一个很宽广的概念,是对大量新 API 的总称。...【详细内容】
2022-01-17  Tags: webSocket  点击:(5)  评论:(0)  加入收藏
最近工作中需要开发前端操作远程虚拟机的功能,简称 WebShell。基于当前的技术栈为 react+django,调研了一会发现大部分的后端实现都是 django+channels 来实现 websocket 服务。...【详细内容】
2021-09-13  Tags: webSocket  点击:(172)  评论:(0)  加入收藏
前言:作为一个刚踏入职场的实习生,我很幸运参加了某个政府项目,并且在项目中负责一个核心模块功能的开发,而不是从头到尾对数据库的crud。虽然我一直心里抱怨我的工作范围根本...【详细内容】
2021-05-24  Tags: webSocket  点击:(422)  评论:(0)  加入收藏
▌简易百科推荐
1.适用型号 该笔记适用于ME31-AXAX0404、ME31-AAAX2240、ME31-XAAX0440、ME31-XAXA0404等网络IO设备。2.功能说明2.1RS-485级联扩展ME31系列网络IO支持通过串口连接RTU设备...【详细内容】
2022-11-03  亿佰特物联网应用  搜狐号  Tags:网络IO   点击:(3)  评论:(0)  加入收藏
电脑不能上网是电脑常见故障之一,具体表现为上网不拨号,或者拨号后不能浏览网页,给工作和学习带来诸多不便,原因是多方面的,比如Modem故障、病毒、软件故障等等,今天跟大家分享电...【详细内容】
2022-11-02  现代快谈    Tags:无法上网   点击:(5)  评论:(0)  加入收藏
无线wifi覆盖的项目越来越多,在做wifi覆盖项目时经常会遇到一些问题,尤其是大中型无线覆盖,牵涉到信道规划,同频干扰,网络延时等实际问题。这里介绍关于无线WiFi覆盖的一些基本常...【详细内容】
2022-11-01  Pheenet菲尼特    Tags:WiFi   点击:(5)  评论:(0)  加入收藏
城市发展建设中,高层建筑越来越多,同时楼宇地下室也成为了人们生活中很重要的区域;生活中常用到的一些电表、水表、气表、水泵等都安装在地下室,需要在地下室对这类能耗数据进行...【详细内容】
2022-10-31  天拓四方智能制造   网易号  Tags:数据采集   点击:(7)  评论:(0)  加入收藏
网络标识:只要把IP和子网掩码的对应二进制位AND得到的结果就叫做网络标识。这种运算通常称为“与”。AND方法:0和1=0, 0和0=0 ,1和1=1。在不在同一网段就用网络标识,即“与”结...【详细内容】
2022-10-31  IP数据云    Tags:IP地址   点击:(5)  评论:(0)  加入收藏
前置知识:MAC地址在说到ARP协议之前,需要了解MAC地址,在OSI七层模型中,第三层是网络层,要解决的是下一跳机制确定的设备位置,具体来说就是网卡地址,MAC地址用于在网络中唯一...【详细内容】
2022-10-30  网络工程师阿龙    Tags:ARP   点击:(11)  评论:(0)  加入收藏
IPv4到IPv6的过渡技术主要有双栈协议,隧道技术和网络地址转换-协议地址转换技术三种技术方案,接下来中科三方将分三篇文章分别针对这三种技术的原理和应用场景做下简单介绍。...【详细内容】
2022-10-28  中科三方    Tags:IPv6   点击:(13)  评论:(0)  加入收藏
本文分享自华为云社区《华为云ECS服务器安装CentOS7.4镜像,部署GINX服务器、搭建物联网视频监控系统》,作者:DS小龙哥。在CentOS7.4服务器版本的环境下安装nginx服务器、配置文...【详细内容】
2022-10-28  华为云开发者联盟    Tags:视频监控   点击:(2)  评论:(0)  加入收藏
很多从事网络工作的小伙伴在组网时经常遇到各种各样的问题,下面我罗列出一些比较典型的问题来一起讨论。1)随着网络中部署的业务量不断增长,单条物理链路的带宽已不能满足正常...【详细内容】
2022-10-26  山里娃007  今日头条  Tags:组网   点击:(3)  评论:(0)  加入收藏
WLAN在使用过程中,有时候会发现无线终端(STA)在ping其他设备时,会出现连续丢包现象。这种情况下可能还伴随ping延时增大(几百毫秒),并导致一些应用感觉不是很好,例如下载速度变慢、...【详细内容】
2022-10-25  山里娃007  今日头条  Tags:丢包   点击:(11)  评论:(0)  加入收藏
站内最新
站内热门
站内头条