Netty 是一個利用 Java 的高級網絡的能力,隱藏其背后的復雜性而提供一個易于使用的 API 的客戶端/服務器框架。
Maven依賴
SpringBootApplication
啟動器中需要new一個NettyServer,并顯式調用啟動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
啟動的NettyServer,這里進行配置
/** *NettyServerNetty服務器配置 *@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)//綁定監聽端口 .childHandler(newChannelInitializer
MyChannelHandlerPool
通道組池,管理所有websocket連接
/** *MyChannelHandlerPool *通道組池,管理所有websocket連接 *@authorzhengkai.blog.csdn.net *@date2019-06-12 */ publicclassMyChannelHandlerPool{ publicMyChannelHandlerPool(){} publicstaticChannelGroupchannelGroup=newDefaultChannelGroup(GlobalEventExecutor.INSTANCE); }
MyWebSocketHandler
處理ws一下幾種情況:
channelActive與客戶端建立連接
channelInactive與客戶端斷開連接
channelRead0客戶端發送消息處理
/** *NettyServerNetty服務器配置 *@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)//綁定監聽端口 .childHandler(newChannelInitializer
socket.html
主要是連接ws,發送消息,以及消息反饋
Controller
寫好了html當然還需要一個controller來引導頁面。
@RestController publicclassIndexController{ @GetMapping("/index") publicModelAndViewindex(){ ModelAndViewmav=newModelAndView("socket"); mav.addObject("uid",RandomUtil.randomNumbers(6)); returnmav; } }
效果演示
改造netty支持url參數
1.首先,調整一下加載handler的順序,優先MyWebSocketHandler在WebSocketServerProtocolHandler之上。
ch.pipeline().addLast(newMyWebSocketHandler()); ch.pipeline().addLast(newWebSocketServerProtocolHandler("/ws",null,true,65536*10)); 2.其次,改造MyWebSocketHandler的channelRead方法,首次連接會是一個FullHttpRequest類型,可以通過FullHttpRequest.uri()獲取完整ws的URL地址,之后接受信息的話,會是一個TextWebSocketFrame類型。
publicclassMyWebSocketHandlerextendsSimpleChannelInboundHandler
socket=newWebSocket("ws://127.0.0.1:12345/ws?uid=666&gid=777"); 4.改造后控制臺輸出情況
收到新連接 與客戶端建立連接,通道開啟! 接收到的參數是:{"uid":"666","gid":"777"} /ws 客戶端收到服務器數據:142531:這里輸入消息 客戶端收到服務器數據:142531:這里輸入消息 客戶端收到服務器數據:142531:這里輸入消息
failed: WebSocket opening handshake timed out
聽說是ssl wss的情況下才會出現,來自 @around-gao 的解決方法: 把MyWebSocketHandler和WebSocketServerProtocolHandler調下順序就好了。
-
服務器
+關注
關注
12文章
9160瀏覽量
85421 -
API
+關注
關注
2文章
1501瀏覽量
62018 -
網絡
+關注
關注
14文章
7565瀏覽量
88788
原文標題:Spring Boot + Netty + WebSocket 實現消息推送
文章出處:【微信號:AndroidPush,微信公眾號:Android編程精選】歡迎添加關注!文章轉載請注明出處。
發布評論請先 登錄
相關推薦
基于多路復用模型的Netty框架
基于阿里云移動推送的移動應用推送模式最佳實踐
如何實現服務器自動推送消息?
怎么去理解netty
怎樣使用springboot整合netty來開發一套高性能的通信系統呢
Springboot整合netty框架實現終端、通訊板子(單片機)TCP/UDP通信案例
![Springboot整合<b class='flag-5'>netty</b>框架<b class='flag-5'>實現</b>終端、通訊板子(單片機)TCP/UDP通信案例](https://file.elecfans.com/web1/M00/D9/4E/pIYBAF_1ac2Ac0EEAABDkS1IP1s689.png)
Netty如何做到單機百萬并發?
netty推送消息接口及實現
jdk17下netty導致堆內存瘋漲原因排查
![jdk17下<b class='flag-5'>netty</b>導致堆內存瘋漲原因排查](https://file1.elecfans.com/web2/M00/A2/99/wKgZomT_2aKAZTSsAAAMHbqoFzI944.png)
評論