在线观看www成人影院-在线观看www日本免费网站-在线观看www视频-在线观看操-欧美18在线-欧美1级

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

Netty如何實(shí)現(xiàn)消息推送

Android編程精選 ? 來(lái)源:Android編程精選 ? 作者:Android編程精選 ? 2022-08-30 09:42 ? 次閱讀

Netty 是一個(gè)利用 Java 的高級(jí)網(wǎng)絡(luò)的能力,隱藏其背后的復(fù)雜性而提供一個(gè)易于使用的 API 的客戶端/服務(wù)器框架。

Maven依賴


   io.netty netty-all 4.1.36.Final  

SpringBootApplication

啟動(dòng)器中需要new一個(gè)NettyServer,并顯式調(diào)用啟動(dòng)netty。


@SpringBootApplication publicclassSpringCloudStudyDemoApplication{ publicstaticvoidmain(String[]args){ SpringApplication.run(SpringCloudStudyDemoApplication.class,args); try{ newNettyServer(12345).start(); System.out.println("https://blog.csdn.net/moshowgame"); System.out.println("http://127.0.0.1:6688/netty-websocket/index"); }catch(Exceptione){ System.out.println("NettyServerError:"+e.getMessage()); } } }

NettyServer

啟動(dòng)的NettyServer,這里進(jìn)行配置


/** *NettyServerNetty服務(wù)器配置 *@authorzhengkai.blog.csdn.net *@date2019-06-12 */ publicclassNettyServer{ privatefinalintport;  publicNettyServer(intport){ this.port=port; }  publicvoidstart()throwsException{ EventLoopGroupbossGroup=newNioEventLoopGroup();  EventLoopGroupgroup=newNioEventLoopGroup(); try{ ServerBootstrapsb=newServerBootstrap(); sb.option(ChannelOption.SO_BACKLOG,1024); sb.group(group,bossGroup)//綁定線程池 .channel(NioServerSocketChannel.class)//指定使用的channel .localAddress(this.port)//綁定監(jiān)聽端口 .childHandler(newChannelInitializer(){//綁定客戶端連接時(shí)候觸發(fā)操作  @Override protectedvoidinitChannel(SocketChannelch)throwsException{ System.out.println("收到新連接"); //websocket協(xié)議本身是基于http協(xié)議的,所以這邊也要使用http解編碼器 ch.pipeline().addLast(newHttpServerCodec()); //以塊的方式來(lái)寫的處理器 ch.pipeline().addLast(newChunkedWriteHandler()); ch.pipeline().addLast(newHttpObjectAggregator(8192)); ch.pipeline().addLast(newWebSocketServerProtocolHandler("/ws",null,true,65536*10)); ch.pipeline().addLast(newMyWebSocketHandler()); } }); ChannelFuturecf=sb.bind().sync();//服務(wù)器異步創(chuàng)建綁定 System.out.println(NettyServer.class+"啟動(dòng)正在監(jiān)聽:"+cf.channel().localAddress()); cf.channel().closeFuture().sync();//關(guān)閉服務(wù)器通道 }finally{ group.shutdownGracefully().sync();//釋放線程池資源 bossGroup.shutdownGracefully().sync(); } } }

MyChannelHandlerPool

通道組池,管理所有websocket連接


/** *MyChannelHandlerPool *通道組池,管理所有websocket連接 *@authorzhengkai.blog.csdn.net *@date2019-06-12 */ publicclassMyChannelHandlerPool{ publicMyChannelHandlerPool(){} publicstaticChannelGroupchannelGroup=newDefaultChannelGroup(GlobalEventExecutor.INSTANCE); }

MyWebSocketHandler

處理ws一下幾種情況:

channelActive與客戶端建立連接

channelInactive與客戶端斷開連接

channelRead0客戶端發(fā)送消息處理


/** *NettyServerNetty服務(wù)器配置 *@authorzhengkai.blog.csdn.net *@date2019-06-12 */ publicclassNettyServer{ privatefinalintport;  publicNettyServer(intport){ this.port=port; }  publicvoidstart()throwsException{ EventLoopGroupbossGroup=newNioEventLoopGroup();  EventLoopGroupgroup=newNioEventLoopGroup(); try{ ServerBootstrapsb=newServerBootstrap(); sb.option(ChannelOption.SO_BACKLOG,1024); sb.group(group,bossGroup)//綁定線程池 .channel(NioServerSocketChannel.class)//指定使用的channel .localAddress(this.port)//綁定監(jiān)聽端口 .childHandler(newChannelInitializer(){//綁定客戶端連接時(shí)候觸發(fā)操作  @Override protectedvoidinitChannel(SocketChannelch)throwsException{ System.out.println("收到新連接"); //websocket協(xié)議本身是基于http協(xié)議的,所以這邊也要使用http解編碼器 ch.pipeline().addLast(newHttpServerCodec()); //以塊的方式來(lái)寫的處理器 ch.pipeline().addLast(newChunkedWriteHandler()); ch.pipeline().addLast(newHttpObjectAggregator(8192)); ch.pipeline().addLast(newWebSocketServerProtocolHandler("/ws","WebSocket",true,65536*10)); ch.pipeline().addLast(newMyWebSocketHandler()); } }); ChannelFuturecf=sb.bind().sync();//服務(wù)器異步創(chuàng)建綁定 System.out.println(NettyServer.class+"啟動(dòng)正在監(jiān)聽:"+cf.channel().localAddress()); cf.channel().closeFuture().sync();//關(guān)閉服務(wù)器通道 }finally{ group.shutdownGracefully().sync();//釋放線程池資源 bossGroup.shutdownGracefully().sync(); } } }

socket.html

主要是連接ws,發(fā)送消息,以及消息反饋


    Netty-Websocket  //byzhengkai.blog.csdn.net varsocket; if(!window.WebSocket){ window.WebSocket=window.MozWebSocket; } if(window.WebSocket){ socket=newWebSocket("ws://127.0.0.1:12345/ws"); socket.onmessage=function(event){ varta=document.getElementById('responseText'); ta.value+=event.data+" "; }; socket.onopen=function(event){ varta=document.getElementById('responseText'); ta.value="Netty-WebSocket服務(wù)器。。。。。。連接 "; }; socket.onclose=function(event){ varta=document.getElementById('responseText'); ta.value="Netty-WebSocket服務(wù)器。。。。。。關(guān)閉 "; }; }else{ alert("您的瀏覽器不支持WebSocket協(xié)議!"); } functionsend(message){ if(!window.WebSocket){return;} if(socket.readyState==WebSocket.OPEN){ socket.send(message); }else{ alert("WebSocket 連接沒(méi)有建立成功!"); }  }          

服務(wù)端返回的應(yīng)答消息

Controller

寫好了html當(dāng)然還需要一個(gè)controller來(lái)引導(dǎo)頁(yè)面。


@RestController publicclassIndexController{  @GetMapping("/index") publicModelAndViewindex(){ ModelAndViewmav=newModelAndView("socket"); mav.addObject("uid",RandomUtil.randomNumbers(6)); returnmav; }  }

效果演示

6b5c9552-27df-11ed-ba43-dac502259ad0.png6b70c680-27df-11ed-ba43-dac502259ad0.png6b7ebaba-27df-11ed-ba43-dac502259ad0.png

改造netty支持url參數(shù)

1.首先,調(diào)整一下加載handler的順序,優(yōu)先MyWebSocketHandler在WebSocketServerProtocolHandler之上。


ch.pipeline().addLast(newMyWebSocketHandler()); ch.pipeline().addLast(newWebSocketServerProtocolHandler("/ws",null,true,65536*10)); 2.其次,改造MyWebSocketHandler的channelRead方法,首次連接會(huì)是一個(gè)FullHttpRequest類型,可以通過(guò)FullHttpRequest.uri()獲取完整ws的URL地址,之后接受信息的話,會(huì)是一個(gè)TextWebSocketFrame類型。

publicclassMyWebSocketHandlerextendsSimpleChannelInboundHandler{ @Override publicvoidchannelActive(ChannelHandlerContextctx)throwsException{ System.out.println("與客戶端建立連接,通道開啟!"); //添加到channelGroup通道組 MyChannelHandlerPool.channelGroup.add(ctx.channel()); } @Override publicvoidchannelInactive(ChannelHandlerContextctx)throwsException{ System.out.println("與客戶端斷開連接,通道關(guān)閉!"); //添加到channelGroup通道組 MyChannelHandlerPool.channelGroup.remove(ctx.channel()); } @Override publicvoidchannelRead(ChannelHandlerContextctx,Objectmsg)throwsException{ //首次連接是FullHttpRequest,處理參數(shù)byzhengkai.blog.csdn.net if(null!=msg&&msginstanceofFullHttpRequest){ FullHttpRequestrequest=(FullHttpRequest)msg; Stringuri=request.uri(); MapparamMap=getUrlParams(uri); System.out.println("接收到的參數(shù)是:"+JSON.toJSONString(paramMap)); //如果url包含參數(shù),需要處理 if(uri.contains("?")){ StringnewUri=uri.substring(0,uri.indexOf("?")); System.out.println(newUri); request.setUri(newUri); } }elseif(msginstanceofTextWebSocketFrame){ //正常的TEXT消息類型 TextWebSocketFrameframe=(TextWebSocketFrame)msg; System.out.println("客戶端收到服務(wù)器數(shù)據(jù):"+frame.text()); sendAllMessage(frame.text()); } super.channelRead(ctx,msg); } @Override protectedvoidchannelRead0(ChannelHandlerContextchannelHandlerContext,TextWebSocketFrametextWebSocketFrame)throwsException{ } privatevoidsendAllMessage(Stringmessage){ //收到信息后,群發(fā)給所有channel MyChannelHandlerPool.channelGroup.writeAndFlush(newTextWebSocketFrame(message)); } privatestaticMapgetUrlParams(Stringurl){ Mapmap=newHashMap<>(); url=url.replace("?",";"); if(!url.contains(";")){ returnmap; } if(url.split(";").length>0){ String[]arr=url.split(";")[1].split("&"); for(Strings:arr){ Stringkey=s.split("=")[0]; Stringvalue=s.split("=")[1]; map.put(key,value); } returnmap; }else{ returnmap; } } } 3.html中的ws地址也進(jìn)行改造

socket=newWebSocket("ws://127.0.0.1:12345/ws?uid=666&gid=777"); 4.改造后控制臺(tái)輸出情況

收到新連接 與客戶端建立連接,通道開啟! 接收到的參數(shù)是:{"uid":"666","gid":"777"} /ws 客戶端收到服務(wù)器數(shù)據(jù):142531:這里輸入消息 客戶端收到服務(wù)器數(shù)據(jù):142531:這里輸入消息 客戶端收到服務(wù)器數(shù)據(jù):142531:這里輸入消息

failed: WebSocket opening handshake timed out

聽說(shuō)是ssl wss的情況下才會(huì)出現(xiàn),來(lái)自 @around-gao 的解決方法: 把MyWebSocketHandler和WebSocketServerProtocolHandler調(diào)下順序就好了。

審核編輯:彭靜
聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問(wèn)題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • 服務(wù)器
    +關(guān)注

    關(guān)注

    12

    文章

    9556

    瀏覽量

    86844
  • API
    API
    +關(guān)注

    關(guān)注

    2

    文章

    1547

    瀏覽量

    63209
  • 網(wǎng)絡(luò)
    +關(guān)注

    關(guān)注

    14

    文章

    7687

    瀏覽量

    90025

原文標(biāo)題:Spring Boot + Netty + WebSocket 實(shí)現(xiàn)消息推送

文章出處:【微信號(hào):AndroidPush,微信公眾號(hào):Android編程精選】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。

收藏 人收藏

    評(píng)論

    相關(guān)推薦

    基于多路復(fù)用模型的Netty框架

    Netty version: 4.1.55.Final 傳統(tǒng)的IO模型的web容器,比如老版本的Tomcat,為了增加系統(tǒng)的吞吐量,需要不斷增加系統(tǒng)核心線程數(shù)量,或者通過(guò)水平擴(kuò)展服務(wù)器數(shù)量,來(lái)增加
    的頭像 發(fā)表于 09-30 11:30 ?936次閱讀

    基于阿里云移動(dòng)推送的移動(dòng)應(yīng)用推送模式最佳實(shí)踐

    推送系統(tǒng)自動(dòng)分配,通過(guò)接口獲取2.2 賬號(hào)與deviceID一一對(duì)應(yīng),對(duì)于同一設(shè)備切換賬號(hào)的場(chǎng)景,通過(guò)重新綁定賬號(hào)實(shí)現(xiàn)2.3 別名一個(gè)deviceID可以對(duì)應(yīng)多個(gè)別名別名是用戶粒度的概念,建議用于單推
    發(fā)表于 03-02 11:48

    如何實(shí)現(xiàn)服務(wù)器自動(dòng)推送消息?

    有個(gè)想法,想和大家探討一下如何實(shí)現(xiàn)。功能:自己在本地寫個(gè)日志,第二天自動(dòng)推送到手機(jī)上想法:想法不成熟,因?yàn)橹R(shí)面太少了,目前想的是自己在本地電腦寫個(gè)日志,上傳給服務(wù)器,服務(wù)器第二天定時(shí)推送到指定郵箱上。想知道如何
    發(fā)表于 03-16 11:34

    怎么去理解netty

    導(dǎo)讀原創(chuàng)文章,轉(zhuǎn)載請(qǐng)注明出處。本文源碼地址:netty-source-code-analysis兩篇開胃小菜過(guò)后,我已經(jīng)有一些粉絲了,還有一些粉絲加了我的好友,有粉絲通過(guò)微信對(duì)我的文章表示了肯定
    發(fā)表于 08-31 06:42

    怎樣使用springboot整合netty來(lái)開發(fā)一套高性能的通信系統(tǒng)呢

    怎樣使用springboot整合netty來(lái)開發(fā)一套高性能的通信系統(tǒng)呢?為什么要用這兩個(gè)框架來(lái)實(shí)現(xiàn)通信服務(wù)呢?如何去實(shí)現(xiàn)呢?
    發(fā)表于 02-22 06:09

    網(wǎng)絡(luò)編程框架netty io介紹

    深入理解網(wǎng)絡(luò)編程框架netty io歡迎大家下載學(xué)習(xí)
    發(fā)表于 09-28 07:36

    如何采用mqtt協(xié)議實(shí)現(xiàn)物聯(lián)網(wǎng)模塊消息推送

    如何采用mqtt協(xié)議實(shí)現(xiàn)物聯(lián)網(wǎng)模塊消息推送
    發(fā)表于 11-03 06:55

    單片機(jī)MQTT如何實(shí)現(xiàn)推送的簡(jiǎn)單使用

    本文檔的主要內(nèi)容詳細(xì)介紹的是單片機(jī)MQTT如何實(shí)現(xiàn)推送的簡(jiǎn)單使用。
    發(fā)表于 07-19 17:37 ?10次下載
    單片機(jī)MQTT如何<b class='flag-5'>實(shí)現(xiàn)</b><b class='flag-5'>推送</b>的簡(jiǎn)單使用

    Springboot整合netty框架實(shí)現(xiàn)終端、通訊板子(單片機(jī))TCP/UDP通信案例

    如何springboot和netty案例的源代碼一個(gè)springboot整合netty框架的開發(fā)小案例,實(shí)現(xiàn)服務(wù)端與單片機(jī)終端實(shí)時(shí)通信的通訊架構(gòu)案例。物聯(lián)網(wǎng)通信給板子下發(fā)指令案例附帶源碼及整合流程步驟
    發(fā)表于 12-29 18:55 ?20次下載
    Springboot整合<b class='flag-5'>netty</b>框架<b class='flag-5'>實(shí)現(xiàn)</b>終端、通訊板子(單片機(jī))TCP/UDP通信案例

    詳解Netty高性能異步事件驅(qū)動(dòng)的網(wǎng)絡(luò)框架

    大家好,今天我們來(lái)聊聊Netty的那些事兒,我們都知道Netty是一個(gè)高性能異步事件驅(qū)動(dòng)的網(wǎng)絡(luò)框架。
    的頭像 發(fā)表于 03-16 10:57 ?2045次閱讀

    Netty如何做到單機(jī)百萬(wàn)并發(fā)?

    說(shuō)起 Netty 的異步模型,我相信大多數(shù)人,只要是寫過(guò)服務(wù)端的話,都是耳熟能詳?shù)模琤ossGroup 和 workerGroup 被 ServerBootstrap 所驅(qū)動(dòng),用起來(lái)簡(jiǎn)直是如虎添翼。
    的頭像 發(fā)表于 09-07 10:51 ?1240次閱讀

    netty推送消息接口及實(shí)現(xiàn)

    學(xué)過(guò) Netty 的都知道,Netty 對(duì) NIO 進(jìn)行了很好的封裝,簡(jiǎn)單的 API,龐大的開源社區(qū)。深受廣大程序員喜愛?;诖吮疚姆窒硪幌禄A(chǔ)的 netty 使用。實(shí)戰(zhàn)制作一個(gè) Netty
    的頭像 發(fā)表于 11-02 16:14 ?1665次閱讀

    一步步解決長(zhǎng)連接Netty服務(wù)內(nèi)存泄漏

    線上應(yīng)用長(zhǎng)連接 Netty 服務(wù)出現(xiàn)內(nèi)存泄漏了!真讓人頭大
    的頭像 發(fā)表于 04-27 14:06 ?1408次閱讀
    一步步解決長(zhǎng)連接<b class='flag-5'>Netty</b>服務(wù)內(nèi)存泄漏

    聊聊Netty那些事兒之從內(nèi)核角度看IO模型

    從今天開始我們來(lái)聊聊Netty的那些事兒,我們都知道Netty是一個(gè)高性能異步事件驅(qū)動(dòng)的網(wǎng)絡(luò)框架。
    的頭像 發(fā)表于 05-23 10:27 ?1565次閱讀
    聊聊<b class='flag-5'>Netty</b>那些事兒之從內(nèi)核角度看IO模型

    jdk17下netty導(dǎo)致堆內(nèi)存瘋漲原因排查

    天網(wǎng)風(fēng)控靈璣系統(tǒng)是基于內(nèi)存計(jì)算實(shí)現(xiàn)的高吞吐低延遲在線計(jì)算服務(wù),提供滑動(dòng)或滾動(dòng)窗口內(nèi)的 count、distinctCout、max、min、avg、sum、std 及區(qū)間分布類的在線統(tǒng)計(jì)計(jì)算服務(wù)
    的頭像 發(fā)表于 09-12 11:22 ?1084次閱讀
    jdk17下<b class='flag-5'>netty</b>導(dǎo)致堆內(nèi)存瘋漲原因排查
    主站蜘蛛池模板: 黄色大片日本 | 操美女的视频网站 | 在线aa| 恨恨操 | 欧美激情91 | 欧美a级网站| 中文字幕乱码人成乱码在线视频 | 4虎影院最近地址 | ww.色| h在线观看免费 | 黄色自拍偷拍 | 亚洲性夜| 四虎影视大全免费入口 | 久久国产精品无码网站 | 一区国产传媒国产精品 | 亚洲精品成人a | 亚洲区 欧美区 | 日本一区二区三区在线 视频观看免费 | 特级毛片aaaaaa蜜桃 | 性色网址 | h小视频在线观看 | 亚洲黄站| 欧美人交性视频在线香蕉 | 深爱五月激情网 | 奇米777狠狠 | 亚洲成a人片在线观看88 | 黄色一级片在线观看 | 久久精品人人爽人人爽 | 国产情侣自拍小视频 | 四虎海外在线永久免费看 | 磁力bt种子搜索在线 | 在线三级网 | 免费又黄又爽1000禁片 | 免费黄色地址 | 天天干夜操 | 欧美专区欧美吧 | 天天做人人爱夜夜爽2020毛片 | 国产视频黄 | 日本黄色录象 | 免费色视频网站 | 韩国理论三级在线观看视频 |