Netty中怎么实现websocket发消息
发表于:2025-02-04 作者:千家信息网编辑
千家信息网最后更新 2025年02月04日,本篇内容介绍了"Netty中怎么实现websocket发消息"的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有
千家信息网最后更新 2025年02月04日Netty中怎么实现websocket发消息
本篇内容介绍了"Netty中怎么实现websocket发消息"的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!
1、pom文件
io.netty netty-all 4.1.25.Final
2、index.html
发送消息:接受消息:
3、main函数
import io.netty.bootstrap.ServerBootstrap;import io.netty.channel.ChannelFuture;import io.netty.channel.EventLoopGroup;import io.netty.channel.nio.NioEventLoopGroup;import io.netty.channel.socket.nio.NioServerSocketChannel;public class WSServer { public static void main(String[] args) throws Exception { //定义一对线程组 // 主线程组, 用于接受客户端的连接,但是不做任何处理,跟老板一样,不做事 EventLoopGroup mainGroup = new NioEventLoopGroup(); // 从线程组, 老板线程组会把任务丢给他,让手下线程组去做任务 EventLoopGroup subGroup = new NioEventLoopGroup(); try { // netty服务器的创建, ServerBootstrap 是一个启动类 ServerBootstrap server = new ServerBootstrap(); server.group(mainGroup, subGroup) // 设置主从线程组 .channel(NioServerSocketChannel.class) // 设置nio的双向通道 .childHandler(new WSServerInitialzer()); //// 子处理器,用于处理workerGroup // 启动server,并且设置8088为启动的端口号,同时启动方式为同步 ChannelFuture future = server.bind(8088).sync(); future.channel().closeFuture().sync(); } finally { // 监听关闭的channel,设置位同步方式 mainGroup.shutdownGracefully(); subGroup.shutdownGracefully(); } }}
4、初始化类
import io.netty.channel.ChannelInitializer;import io.netty.channel.ChannelPipeline;import io.netty.channel.socket.SocketChannel;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 WSServerInitialzer extends ChannelInitializer{ @Override protected void initChannel(SocketChannel ch) throws Exception { ChannelPipeline pipeline = ch.pipeline(); // websocket 基于http协议,所以要有http编解码器 pipeline.addLast(new HttpServerCodec()); // 对写大数据流的支持 pipeline.addLast(new ChunkedWriteHandler()); // 对httpMessage进行聚合,聚合成FullHttpRequest或FullHttpResponse // 几乎在netty中的编程,都会使用到此hanler pipeline.addLast(new HttpObjectAggregator(1024*64)); // ====================== 以上是用于支持http协议 ====================== // ====================== 以下是支持httpWebsocket ====================== /** * websocket 服务器处理的协议,用于指定给客户端连接访问的路由 : /ws * 本handler会帮你处理一些繁重的复杂的事 * 会帮你处理握手动作: handshaking(close, ping, pong) ping + pong = 心跳 * 对于websocket来讲,都是以frames进行传输的,不同的数据类型对应的frames也不同 */ pipeline.addLast(new WebSocketServerProtocolHandler("/ws")); // 自定义的handler pipeline.addLast(new ChatHandler()); }}
5、助手类
import io.netty.channel.Channel;import io.netty.channel.ChannelHandlerContext;import io.netty.channel.SimpleChannelInboundHandler;import io.netty.channel.group.ChannelGroup;import io.netty.channel.group.DefaultChannelGroup;import io.netty.handler.codec.http.websocketx.TextWebSocketFrame;import io.netty.util.concurrent.GlobalEventExecutor;/** * * @Description: 处理消息的handler * TextWebSocketFrame: 在netty中,是用于为websocket专门处理文本的对象,frame是消息的载体 */public class ChatHandler extends SimpleChannelInboundHandler{ // 用于记录和管理所有客户端的channle private static ChannelGroup clients = new DefaultChannelGroup(GlobalEventExecutor.INSTANCE); @Override protected void channelRead0(ChannelHandlerContext ctx, TextWebSocketFrame msg) throws Exception { // 获取客户端传输过来的消息 String content = msg.text(); System.out.println("接受到的数据:" + content); //类似于for循环 clients.writeAndFlush( new TextWebSocketFrame( "[服务器在]" + LocalDateTime.now() + "接受到消息, 消息为:" + content)); } /** * 当客户端连接服务端之后(打开连接) * 获取客户端的channle,并且放到ChannelGroup中去进行管理 */ @Override public void handlerAdded(ChannelHandlerContext ctx) throws Exception { clients.add(ctx.channel()); } @Override public void handlerRemoved(ChannelHandlerContext ctx) throws Exception { // 当触发handlerRemoved,ChannelGroup会自动移除对应客户端的channel// clients.remove(ctx.channel()); System.out.println("客户端断开,channle对应的长id为:" + ctx.channel().id().asLongText()); System.out.println("客户端断开,channle对应的短id为:" + ctx.channel().id().asShortText()); }}
6、测试
运行index.html
发送消息,如下server端返回消息
"Netty中怎么实现websocket发消息"的内容就介绍到这里了,感谢大家的阅读。如果想了解更多行业相关的知识可以关注网站,小编将为大家输出更多高质量的实用文章!
消息
客户
处理
线程
客户端
端的
支持
服务
数据
服务器
不同
任务
内容
方式
更多
知识
老板
传输
同步
管理
数据库的安全要保护哪些东西
数据库安全各自的含义是什么
生产安全数据库录入
数据库的安全性及管理
数据库安全策略包含哪些
海淀数据库安全审计系统
建立农村房屋安全信息数据库
易用的数据库客户端支持安全管理
连接数据库失败ssl安全错误
数据库的锁怎样保障安全
神州量子网络技术有限公司
成都博软软件开发
数据库系统的应用模式有
宝山区好的软件开发推荐
电脑服务器系统下载
帝国神话服务器地图名称
东丽网络安全宣传
绝地求生2需要什么服务器
乌鲁木齐垃圾分类软件开发
网络安全公需课培训考试
vtm 软件开发标准
为有效落实网络安全责任
wordpress数据库
sql数据库管理教学视频
张店区科途软件开发工作室
数据库是数据集合吗
关系数据库 数据结构
湖北智慧医养软件开发公司
市委网络安全和信息化工作会议
教育部安全数据库
数据库连接不上arcgis
网络技术工程课程
数据库系统的应用模式有
数据库原理与应用 课程标准
网络安全攻防宣传
云服务器开发需要哪些技能
苹果招人网络技术
什么叫OA软件开发
代谢病数据库
数据库应用技术性考任务答案