Netty中怎么实现websocket发消息
发表于:2025-12-02 作者:千家信息网编辑
千家信息网最后更新 2025年12月02日,本篇内容介绍了"Netty中怎么实现websocket发消息"的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有
千家信息网最后更新 2025年12月02日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安全错误
数据库的锁怎样保障安全
我的世界服务器怎么连接商店
专业的网络技术公司
企业如何做好网络安全和数据安全
云计算和网络安全哪个难学
粒鲜生网络技术有限公司
软件开发需要的掌握的
网络安全工程师要会编程吗
棋牌手机软件开发
php支持哪些数据库
app软件开发与设计专业
怎样面对网络安全威胁
服务器dns地址总是被改
大疆飞行安全数据库升级
判断服务器图片是否存在
小学 网络安全法 解读
报名系统显示内部服务器错误
湖北网络安全培训机构线上学习
什么叫网络安全专业
数据库安全管理包括哪些内容
江岸靠谱的软件开发价格
久久服务器
移动光猫服务器可以选择吗
哪些数据库可以查找期刊
广东省数据库期末考试题目
mc服务器怎么换大厅
服务器管理员名称一般用啥
小宇服务器管理工具
网络安全和医疗哪个好
软件开发平台销售
人事系统管理软件开发细项