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文章
9010浏览量
85160 -
API
+关注
关注
2文章
1483浏览量
61797 -
网络
+关注
关注
14文章
7511浏览量
88605
原文标题:Spring Boot + Netty + WebSocket 实现消息推送
文章出处:【微信号:AndroidPush,微信公众号:Android编程精选】欢迎添加关注!文章转载请注明出处。
发布评论请先 登录
相关推荐
评论