用springboot+netty搭建在线web聊天室

article/2025/10/14 0:19:49

最近自己搭建了一个在线的聊天室,利用netty技术开发,实现在线聊天以及群聊功能,包括好友添加等相关功能,目前还在更新中。

1.我是通过springboot+netty实现,通过使用netty4实现,运用这种方式就可以帮助我们实现websocket通信,其中核心功能如下:

public class NettyWebsocketServer implements Runnable{@AutowiredNettyWebsocketChildHandlerInitializer childHandlerInitializer; private static final int PORT=8088;private static final int RCV_ALLOCTOR_SIZE=592048;EventLoopGroup bossGroup=new NioEventLoopGroup();EventLoopGroup workGroup=new NioEventLoopGroup();ServerBootstrap serverBootstrap=new ServerBootstrap();private ChannelFuture channelFuture;public NettyWebsocketServer() {}@Overridepublic void run() {build();	}/*** 启动服务*/public void build() {long startTm=System.currentTimeMillis();try {serverBootstrap.group(bossGroup, workGroup).channel(NioServerSocketChannel.class).option(ChannelOption.SO_BACKLOG, 1024) //Tcp参数,握手字符长度.childOption(ChannelOption.TCP_NODELAY, true) //设置TCP NO_DELAY 算法 尽量减少发送大文件包.childOption(ChannelOption.SO_KEEPALIVE, true) // 针对子线程的配置 保持长连接.childOption(ChannelOption.RCVBUF_ALLOCATOR, new FixedRecvByteBufAllocator(RCV_ALLOCTOR_SIZE)) // 配置固定长度接收缓存内存分配.childHandler(childHandlerInitializer);channelFuture = serverBootstrap.bind(PORT).sync();// 监听关闭channelFuture.channel().closeFuture().sync();long endTm=System.currentTimeMillis();log.info("服务器启动完成,耗时:[{}]毫秒,已在端口[{}]阻塞",endTm-startTm,PORT);}catch (Exception e) {bossGroup.shutdownGracefully();workGroup.shutdownGracefully();}}public void close() {channelFuture.channel().close();Future<?> bossFuture=bossGroup.shutdownGracefully();Future<?> workFuture=workGroup.shutdownGracefully();try {bossFuture.await();workFuture.await();}catch (Exception e) {// TODO: handle exception}}public ChannelHandler getChannelHandler() {return childHandlerInitializer;}
}

这个类是websocket的服务端。

2.接下来还需要websocket处理器。

@Component
@Sharable
public class NettyWebSocketServerHandler extends SimpleChannelInboundHandler<WebSocketFrame>{private final ChatService chatService;public NettyWebSocketServerHandler(ChatService chatService) {this.chatService=chatService;}@Overrideprotected void channelRead0(ChannelHandlerContext ctx, WebSocketFrame frame) throws Exception {doHandler(ctx, frame);}private void doHandler(ChannelHandlerContext ctx, WebSocketFrame frame) {if(frame instanceof CloseWebSocketFrame) {try {	WebSocketServerHandshaker handshaker=Constant.webSocketHandshakerMap.get(ctx.channel().id().asLongText());//WebSocketServerHandshaker handshaker=JSONObject.parseObject(jedis.get(ctx.channel().id().asLongText()), WebSocketServerHandshaker.class);if(handshaker==null) {sendErrorMessage(ctx, "该用户已离线或不存在该连接");}else {handshaker.close(ctx.channel(), ((CloseWebSocketFrame)frame).retain()); //增加消息的引用计数}}finally {}	return;}//ping请求if(frame instanceof PingWebSocketFrame) {ctx.channel().writeAndFlush(new PongWebSocketFrame(frame.content().retain()));return ;}if(!(frame instanceof TextWebSocketFrame)) {sendErrorMessage(ctx, "不支持二进制文件");return ;}String request=((TextWebSocketFrame) frame).text();JSONObject params=null;try {params=JSONObject.parseObject(request);log.info("收到服务器消息:[{}]",params);}catch (Exception e) {sendErrorMessage(ctx, "转换出错");log.info("参数转换错误");}if(null==params) {sendErrorMessage(ctx, "参数为空");log.warn("参数为空");return ;}String msgType=(String)params.get("type");switch (msgType) {case "REGISTER":chatService.register(params, ctx);break;case "SINGLE_SENDING": //发消息个单个人chatService.sendOne(params, ctx);break;case "GROUP_SENDING": //群发chatService.sendGroup(params, ctx);break;case "FILE_MSG_SINGLE_SENDING": //发文件给单个人break;case "FILE_MSG_GROUP_SENDING": //群发文件default:break;}}/*** 发送错误消息给客户端* @param ctx* @param msg*/public void sendErrorMessage(ChannelHandlerContext ctx,String msg) {String result=new ApiResult().failed(msg).toString();ctx.channel().writeAndFlush(new TextWebSocketFrame(result)); //通知所有已经连接的WebSocket客户端新的客户端}@Overridepublic void channelInactive(ChannelHandlerContext ctx) {if(ctx!=null) {//Constant.webSocketHandshakerMap.remove(Constant.onlineUserMap.get(ctx.channel().id().asLongText()));//Constant.onlineUserMap.remove(String.valueOf(user.getUserID()));   //jedis.del(context.channel().id().asLongText());//jedis.del(String.valueOf(user.getUserID())+"_online");}chatService.remove(ctx);//String userChannel=jedis.get(String.valueOf(user.getUserID())+"_online");//ChannelHandlerContext context=JSONObject.parseObject(userChannel, ChannelHandlerContext.class);log.info("已离线");}/*** 出现异常触发*/@Overridepublic void exceptionCaught(ChannelHandlerContext ctx, Throwable cause)throws Exception {cause.printStackTrace();ctx.close();}
}

当然还有其他一些类,http请求处理器,需要将http协议升级为websocket协议,这里就不一一写了。

3.下面是我实现后的界面展示:
1)登录页
在这里插入图片描述
2)登录后的聊天界面:
在这里插入图片描述
在这里插入图片描述
大家也可以自己登录看看,不过需要先注册后才可以登录。
测试账号:116 密码:123456
网站地址: 炫彩聊天室


http://chatgpt.dhexx.cn/article/lEdFYbDy.shtml

相关文章

基于SSM的Web网页聊天室系统

目 录 第1章 前 言 1 1.1 论文研究的目的和意义 1 1.2 国内外研究综述 2 1.3 论文研究的内容和取得的成果 2 第2章 即时通讯聊天系统开发涉及技术简介 4 2.1 Spring简介 4 2.2 SpringMVC简介 4 2.3 MyBatis简介 5 2.4 AmazeUI简介 5 2.5 开发工具介绍 5 2.5.1 Eclipse集成开发环…

【项目设计】基于WebSocket的Web聊天室

文章目录 1. 项目简介2. 数据库表的设计3. 实体类以及工具类的设计3.1 实体类model3.1.1 lombok的使用 3.2 工具类util3.2.1 DBUtil3.2.2 WebUtil 4. 注册功能4.1 前端设计4.2 关于Ajax技术的介绍4.3 后端设计 5. 登陆功能5.1 前端设计5.2 后端设计 6. 获取频道列表6.1 前端设计…

手把手教你写一个web聊天室之bookstap框架

一&#xff1a;bookstap简介 Bootstrap&#xff0c;来自 Twitter&#xff0c;是目前最受欢迎的前端框架。Bootstrap 是基于 HTML、CSS、JAVASCRIPT 的&#xff0c;它简洁灵活&#xff0c;使得 Web 开发更加快捷。并且对开发响应式网页十分友好&#xff0c;使用框架进行网页开发…

从零开始搭建 web 聊天室(一)

本篇将介绍如何快速、简便地使用 socket.io 库搭建一个 web 在线聊天室。前端并没有使用任何框架。后端使用 express 框架搭建简易的后端。 socket.io 库本质上是基于 websocket 上进行封装。改变了以往只能前端发送请求&#xff0c;后端才能返回给前端信息&#xff0c;这样的…

基于socket.io的web聊天室

基于socket.io的web聊天室 一、 项目介绍 该项目使用node.js作为后端服务器框架&#xff0c;并利用socket.io来实现web聊天室功能。socket.io是由 JavaScript 实现的基于Node.js架构体系的用于实时通信的开源框架&#xff0c;它包括了客户端的 JavaScript 库和 服务器端的 No…

一个轻量级多功能免费开源web聊天室

一个轻量级多功能免费开源web聊天室&#xff0c;轻量级实用功能多而强悍的聊天室系统 版本特点&#xff1a; 支持图文发送,兼容QQ内置,微信内置,pc等浏览器 无需服务端操作,phpmysql高效运行,无需第三方插件 高效极快的运行速度 聊天室bbs推送 多功能聊天室 支持一键粘贴网页图…

web聊天室项目开发过程及重难点整理

目录 一、需求分析二、业务背景1.张三要发消息给李四2.WebSocket实现消息推送流程 三、前后端接口和数据库系统设计1.用户相关的接口2.频道相关接口3.数据库表的设计 四、功能交互实现原理及代码展示1.输入url访问主页2.调用检查登陆状态接口2.1参数ok&#xff1a;true时显示登…

django WEB聊天室项目

bbs系统项目中我们用到的ajax不多,但是在聊天室里用到的全是ajax,所以本项目的主要内容就是: 前端使用ajax传输json格式的数据是本节的重点以及 前端函数的的使用. http协议的特点是:短链接 ,服务器无法主动向客户端发送消息.都是客户端请求服务器返回消息. 那么问题来了,WEB聊…

Web聊天室项目

Web聊天室 项目描述所用技术业务分析接口设计和整体业务流程相关代码程序演示 项目描述 实现一个类似于在线QQ聊天的功能&#xff0c;不同的用户可以在相同的频道里发送和接受消息从而达到在线聊天的功能。 项目的主要功能有&#xff1a;注册用户、用户登陆、频道主页、进入频…

Web聊天室

目录 一&#xff0c;简介 二&#xff0c;开发环境 三&#xff0c;涉及的技术 四&#xff0c;主要功能 1.注册功能 2.登录功能 3.异地登陆&#xff08;第一次登录网页会被强制退出&#xff09; 4.发送消息 5.接收消息 6.注销登录 五&#xff0c;准备工作 1.引入开发…

八个步骤实现一个Web项目(在线聊天室)

实现一个在线网页的聊天室 Hello&#xff0c;今天给大家带来的是我的一个Web项目的开发过程的相关步骤&#xff0c;这个项目实现的功能是一个Web在线聊天室&#xff0c;简单的来说就是实现在网页版的聊天框&#xff0c;能够实现对于用户信息进行注册&#xff0c;登录&#xff…

基于JavaWeb聊天室设计与实现

目 录 摘要 i Abstract ii 1 概述 1 1.1 聊天室系统的基本概念 1 1.2 开发聊天室系统的意义 1 1.3 目前的研究现状 1 1.4 总体设计的基本思路 1 2 主要技术 3 2.1 JSP技术 3 2.2 JavaBean技术 4 2.3 Servlet技术 4 2.4 MyEclipse开发工具 6 2.5 Access数据库技术 6 2.6 Tomcat…

【Hadoop篇】启动hdfs集群时,提示: ERROR: Cannot set priority of zkfc process 5668

【问题描述】 启动hdfs集群时&#xff0c;遇到如下错误 [dylanhadoop102 hadoop]$ start-dfs.sh Starting namenodes on [hadoop102] Starting datanodes Starting secondary namenodes [hadoop104] Starting ZK Failover Controllers on NN hosts [hadoop102] hadoop102: ERR…

hadoop(XShell) 出现错误ERROR: Cannot set priority of namenode process 7927

项目场景&#xff1a; 网页上出错&#xff1a;&#xff08;出现这种问题有时候也可能是没有关闭防火墙&#xff09;&#xff0c;也可能是一下这种错误。 XShell上出错&#xff1a; 问题描述 XShell提示该地方出错&#xff1a; 上面说了是mapred-site.sml文件出错了 原因分析…

Yarn启动报错,ERROR: Cannot set priority of registrydns process xxxxx

问题&#xff1a; HDP 安装 yarn 时。或者重启服务的时候&#xff0c;yarn registry dns 无法启动。如下图所示&#xff1a; 报错信息&#xff1a; 查看报错信息&#xff0c;报错信息如下所示&#xff1a; ERROR: Cannot set priority of registrydns process xxxxx解决方式…

启动Hadoop集群,出现Cannot set priority of nodemanager(resourcemanager) process xxx问题

背景 &#xff08;不感兴趣可以跳过背景介绍&#xff09; 配置 Ubantu20.04jdk1.8.0_221hadoop 3.3.1hive 3.1.3三台虚拟机搭建Hadoop集群在安装hive的过程中&#xff0c;初始化数据库成功后&#xff08;mysql&#xff09;&#xff0c;输入 命令: ./bin/hive启动hive时出错&a…

【Hadoop】关于Hadoop集群HDFS启动问题:DataNode启动报错ERROR: Cannot set priority of namenode process

关于Hadoop集群HDFS启动问题&#xff1a;NameNode启动正常&#xff0c;DataNode启动报错ERROR: Cannot set priority of namenode process 19826 出了问题第一步一定要先看日志&#xff01;看日志&#xff01;看日志&#xff01; DataNode日志文件在Hadoop目录下的logs文件夹 …

Hadoop安装错误:Cannot set priority of secondarynamenode process : xxxxx

这是由于当前用户与可操作用户不匹配&#xff0c;产生权限冲突 使用以下命令可解决 chown -R root:root 文件名/&#xff0c;如 chown -R root:root hadoop3.1.3/ 成果&#xff1a;

Cannot set priority of datanode proces

hadoop03: ERROR: Cannot set priority of datanode process 2518错误解决 修改hdfs-site.xml配置文件 我的配置是 <configuration> <property><name>dfs.replication</name><value>4</value><description>副本个数&#xff0c;默…

启动hadoop集群报错ERROR: Cannot set priority of namenode process 2570

在格式化集群正常的情况下启动hadoop集群&#xff0c;但是却启动不起来&#xff0c;jps查看进程也是没有进程的&#xff1a; 查看log定位问题&#xff1a; [roothadoop320_01 logs]# cat hadoop-root-namenode-hadoop320_01.log因为主机名中包含了下划线&#xff0c;所以报错。…