SpringBoot整合Netty实现WebSocket的示例代码
目录
- 一、pom.xml依赖配置
- 二、代码
- 2.1、NettyServer 类
- 2.2、SocketHandler 类
- 2.3、ChannelHandlerPool 类
- 2.4、Application启动类
- 三、测试
一、pom.xml依赖配置
io.netty netty-all4.1.50.Final
二、代码
2.1、NettyServer 类
package com.wangjing.socket.server; import com.wangjing.socket.handler.CoordinationSocketHandler; import io.netty.bootstrap.ServerBootstrap; import io.netty.channel.ChannelFuture; import io.netty.channel.ChannelInitializer; import io.netty.channel.ChannelOption; import io.netty.channel.EventLoopGroup; import io.netty.channel.nio.NioEventLoopGroup; import io.netty.channel.socket.SocketChannel; import io.netty.channel.socket.nio.NioServerSocketChannel; import io.netty.handler.codec.http.HttpObjectAggregator; import io.netty.handler.codec.http.HttpServerCodec; import io.netty.handler.codec.http.websocketx.WebSocketServerProtocolHandler; import io.netty.handler.stream.ChunkedWriteHandler; public class CoordinationNettyServer { private final int port; public CoordinationNettyServer(int port) {this.port = port; } public void start() throws Exception {EventLoopGroup bossGroup = new NioEventLoopGroup(); EventLoopGroup group = new NioEventLoopGroup(); try {ServerBootstrap sb = new ServerBootstrap(); sb.option(ChannelOption.SO_BACKLOG, 1024); sb.group(group, bossGroup) // 绑定线程池.channel(NioServerSocketChannel.class) // 指定使用的channel.localAddress(this.port)// 绑定监听端口.childHandler(new ChannelInitializer() { // 绑定客户端连接时候触发操作@Overrideprotected void initChannel(SocketChannel ch) throws Exception {//websocket协议本身是基于http协议的,所以这边也要使用http解编码器ch.pipeline().addLast(new HttpServerCodec()); //以块的方式来写的处理器ch.pipeline().addLast(new ChunkedWriteHandler()); ch.pipeline().addLast(new HttpObjectAggregator(8192)); ch.pipeline().addLast(new WebSocketServerProtocolHandler("/ws", "WebSocket", true, 65536 * 10)); ch.pipeline().addLast(new CoordinationSocketHandler()); //自定义消息处理类}}); ChannelFuture cf = sb.bind().sync(); // 服务器异步创建绑定System.out.println(CoordinationNettyServer.class + "已启动,正在监听: " + cf.channel().localAddress()); cf.channel().closeFuture().sync(); // 关闭服务器通道} finally {group.shutdownGracefully().sync(); // 释放线程池资源bossGroup.shutdownGracefully().sync(); }}}
2.2、SocketHandler 类
package com.wangjing.socket.handler; import com.wangjing.socket.pool.CoordinationChannelHandlerPool; import io.netty.channel.ChannelHandlerContext; import io.netty.channel.SimpleChannelInboundHandler; import io.netty.handler.codec.http.websocketx.TextWebSocketFrame; public class CoordinationSocketHandler extends SimpleChannelInboundHandler{ @Overridepublic void channelActive(ChannelHandlerContext ctx) throws Exception {System.out.println("与客户端建立连接,通道开启!"); //添加到channelGroup通道组CoordinationChannelHandlerPool.channelGroup.add(ctx.channel()); } @Overridepublic void channelInactive(ChannelHandlerContext ctx) throws Exception {System.out.println("与客户端断开连接,通道关闭!"); //从channelGroup通道组删除CoordinationChannelHandlerPool.channelGroup.remove(ctx.channel()); } @Overrideprotected void channelRead0(ChannelHandlerContext ctx, TextWebSocketFrame msg) throws Exception {//接收的消息System.out.println(String.format("收到客户端%s的数据:%s", ctx.channel().id(), msg.text())); // 单独发消息// sendMessage(ctx); // 群发消息sendAllMessage(); } private void sendMessage(ChannelHandlerContext ctx) throws InterruptedException {String message = "我是服务器,你好呀"; ctx.writeAndFlush(new TextWebSocketFrame("hello")); } private void sendAllMessage() {String message = "我是服务器,这是群发消息"; CoordinationChannelHandlerPool.channelGroup.writeAndFlush(new TextWebSocketFrame(message)); } }
2.3、ChannelHandlerPool 类
package com.wangjing.socket.pool; import io.netty.channel.group.ChannelGroup; import io.netty.channel.group.DefaultChannelGroup; import io.netty.util.concurrent.GlobalEventExecutor; public class CoordinationChannelHandlerPool { public CoordinationChannelHandlerPool() {} //可以存储userId与ChannelId的映射表//public static ConcurrentHashMap channelIdMap = new ConcurrentHashMap<>(); //channelGroup通道组public static ChannelGroup channelGroup = new DefaultChannelGroup(GlobalEventExecutor.INSTANCE); }
2.4、Application启动类
package com.wangjing.socket; import com.wangjing.socket.server.CoordinationNettyServer; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; @SpringBootApplication(scanBasePackages = "com.wangjing")public class SocketApplication { public static void main(String[] args) {SpringApplication.run(SocketApplication.class, args); try {new CoordinationNettyServer(8804).start(); } catch (Exception e) {System.out.println("NettyServerError:" + e.getMessage()); }} }
三、测试 websocket 在线测试推荐:在线websocket测试-online tool-postjson
文章图片
【SpringBoot整合Netty实现WebSocket的示例代码】到此这篇关于SpringBoot整合Netty实现WebSocket的示例代码的文章就介绍到这了,更多相关SpringBoot整合Netty实现WebSocket内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!
推荐阅读
- 基于SpringBoot使用MyBatis插件的问题
- SpringBoot|SpringBoot 枚举类型的自动转换的实现
- Springboot整合系列|SpringBoot高级整合 尚硅谷雷锋阳 学习笔记
- springboot|springboot的web进阶知识(1)
- RabbitMQ|RabbitMQ学习文档(进阶篇(Demo使用SpringBoot编写))
- Spring|SpringBoot学习笔记二(进阶内容)
- SpringBootTest单元测试实战、SpringBoot测试进阶高级篇之MockMvc讲解
- 微服务架构 | 8.1 使用 Spring Cloud Stream 整合 Apache kafka #yyds干货盘点#
- 微服务|springboot和springcloudAlibaba的版本对应关系
- java|SpringBoot和Spring Cloud以及SpringCloud Alibaba版本对应关系