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編程精選】歡迎添加關注!文章轉載請注明出處。
發布評論請先 登錄
相關推薦
評論