Web聊天室项目

article/2025/10/14 2:35:35

Web聊天室

  • 项目描述
  • 所用技术
  • 业务分析
  • 接口设计和整体业务流程
  • 相关代码
  • 程序演示

项目描述

实现一个类似于在线QQ聊天的功能,不同的用户可以在相同的频道里发送和接受消息从而达到在线聊天的功能。

  • 项目的主要功能有:注册用户、用户登陆、频道主页、进入频道聊天、获取历史消息
  • 数据传输使用AJAX 技术来将JSON数据格式传输实现前后端数据交互
  • 用户的登陆后的状态保持采用的是Session技术
  • 消息的发送采用的是WebSocket
  • 使用JDBC操作MySQL管理用户表、频道表和消息表
  • 使用Maven来管理项目

所用技术

项目主要涉及到的知识:MySQL、Servlet、JSON、AJAX 、WebSocket

何为websocket心跳机制?
websockt心跳机制,不得不说很形象;那何为心跳机制,就是表明client与server的连接是否还在的检测机制;

如果不存在检测,那么网络突然断开,造成的后果就是client、server可能还在傻乎乎的发送无用的消息,浪费了资源;

怎样检测呢?原理就是定时向server发送消息,如果接收到server的响应就表明连接依旧存在;

业务分析

主要功能分析

  • 登录:同一个网页登录可以看到用户信息,不登录看到登录注册按钮
  • 有多个消息频道,对应的消息频道可以收发消息,不同的消息频道不能收发消息
  • 用户退出登录后,再次登录后可以看到上次登录后的消息

消息推送
首先我们遇到的第一个问题便是如何收发消息呢,我们需要实现客户端到客户端之间的通讯。
在这里插入图片描述

一般都会想到http,但是这里使用http是无法实现的,主要原因有两点

  • http的服务端无法像客户端发消息
  • http是短连接无状态的,但我们需要建立一个长连接来进行聊天,所以不符合要求
  • http发送消息需要ip地址,但客户端ip地址是不公开在公网上的,所以无法从客户端使用http进行发送消息

所以这里我们使用了WebSocket的技术(可以实现服务端主动向客户端发送消息),客户端保持和服务端的长连接,其实服务端向客户端发消息的方式有许多

  • 轮询方式:客户端定时向服务端发送Ajax请求,服务端接收到请求之后立马返回并关闭连接,但TCP的建立和关闭会浪费时间和带宽
  • 长轮询:客户端向服务器发送Ajax请求,服务器接收到请求之后hold住连接,直到有新消息才返回相应,但服务端hold住链接会消耗资源,返回的数据顺序无保证,难以管理。
  • 长连接:在页面里嵌入一个隐藏的iframe,将这个隐藏iframe的src属性设置为对一个长连接的请求,服务端就能源源不要短的向客户端发消息了,服务器维护一个长连接会增加开销,当客户端越来越多的时候,server压力大!

上面的几种方式都有一定的缺点,综合考虑WebSocket是最优的WebSocket设计出来的目的就是取代轮询和长连接,使客户端浏览器具备像C/S 框架下桌面系统的即时通讯能力,实现了浏览器和服务器全双工通信,建立在TCP之上,虽然WebSocket和HTTP一样通过TCP来传输数据,但WebSocket可以主动的向对方发送或接收数据,就像Socket一样;并且WebSocket需要类似TCP的客户端和服务端通过握手连接,连接成功后才能互相通信。
WebSocket的核心:双向通信、事件驱动、异步
WebSocket 原理:WebSocket 协议本质上是一个基于 TCP 的协议。为了建立一个 WebSocket 连接,客户端浏览器首先要向服务器发起一个 HTTP 请求,这个请求和通常的 HTTP 请求不同,包含了一些附加头信息,附加信息
在这里插入图片描述
WebSocket实现消息推送的流程

  • 客户端和服务端建立连接(只能由客户端发起请求)

在这里插入图片描述

  • 双方通信(全双工)

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

接口设计和整体业务流程

前后端相关接口

  • 注册
  • 登录(输入账号密码,点击登录后调用的接口)
  • 检查登录状态(页面初始化后调用的接口)加粗样式

整体流程
在这里插入图片描述
登录之后会调用频道列表消息和初始化WebSocket接口
在这里插入图片描述
基于上面的业务,客户端接收消息有两个场景

  • 上次登录以后的消息(发送的消息要保存在数据库当中,所以直接在数据库中查询即可,要在服务端建立连接事件中便返回数据)

在这里插入图片描述

  • 新的消息(服务端接受到消息后要保存到数据库当中,并且转发给所有在线的客户端)

在这里插入图片描述

concurrenthamap保存的是userid和对应客户端的websocket链接的session
concurrentHashmap(),假如有好多个用户同时登陆发起WebSocket连接的话,tomact运行多个线程去执行,在put操作的时候,

虽然需求比较简单,但在具体实现时还是有许多需要注意的地方,还需不断改进。

相关代码

源码链接(Servlet版):https://github.com/jw1028/WebChat
源码链接(Spring版):https://github.com/jw1028/WebChatroom

程序演示

  • 登录

在这里插入图片描述

  • 频道列表页面

在这里插入图片描述

  • 添加频道

在这里插入图片描述
在这里插入图片描述

  • 删除频道
    在这里插入图片描述
    在这里插入图片描述
  • 不同的客户端建立连接发送消息:

在这里插入图片描述

在这里插入图片描述


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

相关文章

Web聊天室

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

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

实现一个在线网页的聊天室 Hello,今天给大家带来的是我的一个Web项目的开发过程的相关步骤,这个项目实现的功能是一个Web在线聊天室,简单的来说就是实现在网页版的聊天框,能够实现对于用户信息进行注册,登录&#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集群时,遇到如下错误 [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

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

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

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

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

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

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

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

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

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

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;所以报错。…

JAVA-线程优先级setPriority

JAVA-线程优先级setPriority 1. 说明 线程分为1-10级&#xff0c;10级最高&#xff0c;优先级的高低不代表线程优先执行&#xff0c;需要看CPU的情况&#xff0c;一般情况下优先级高的先执行&#xff0c;程序先执行主方法&#xff0c;在执行线程。 2. 代码实现 public class …

hadoop入门1:ERROR Cannot set priority of datanode process

问题现象&#xff1a; 部署hadoop-3.1.2&#xff0c;启动hdfs时出现如下错误&#xff1a; Starting datanodes zglinux: ERROR: Cannot set priority of datanode process 2905解决方案&#xff1a; 此问题困扰了很久&#xff0c;百度上也搜不到&#xff0c;且是我已经在公司…

hadoop报错ERROR: Cannot set priority of namenode process

现象&#xff1a; 解决&#xff1a; 1.看Hadoop的日志&#xff1a; 查看namenode日志&#xff1a;tail -n 200 hadoop-xinjie-namenode-VM-0-9-centos.log &#xff08;文件目录所在位置&#xff1a;hadoop安装位置logs文件&#xff09; 2.发现是端口占用 3.命令查看端口占用…

Cannot set priority of nodemanager process xxx问题

Cannot set priority of nodemanager process xxx问题 一、问题描述 这个问题是我在配置hadoop集群时遇到的问题&#xff0c;启动resourcemanager和nodemanager时总会出现&#xff0c;但是奇怪的是只会在第二台机器出现这个问题&#xff0c;当把resourcemanager配置到其他机器时…

关于hadoop的Cannot set priority of datanode process

关于使用Hadoop3.1.2安装时的报错&#xff0c;在进行start-dfs.sh发生了Cannot set priority of datanode process xxx的报错。 之前搜索了很多文章一直没有效果&#xff0c;用了一个下午的时间。最后我思考是不是我的初始化操作有问题。因为之前我用root账户进行了初始化操作…

Hadoop在启动yarn时报错:Cannot set priority of resourcemanager process xxxxx

着急看解决方法的请直接奔文末。 今天刚开始弄Hadoop&#xff0c;启动完namenode和hadoop之后&#xff0c;开始启动yarn&#xff0c;结果直接报错了&#xff1a; Cannot set priority of resourcemanager process 93826 翻译过来就是说&#xff1a;无法设置resourcemanager进…

Traceroute和Tracert

Traceroute是Linux和Mac OS等系统默认提供的路由追踪小程序&#xff0c;Tracert是Windows系统默认提供的路由追踪小程序。二者的功能相同&#xff0c;都能探测数据包从源地址到目的地址经过的路由器的IP地址。Traceroute/Tracert的实现都借助了TTL&#xff1a;通过向目的地址发…

Centos安装traceroute

Centos安装traceroute 什么是traceroute&#xff0c;网络追踪 traceroute (Windows 系统下是tracert) 命令利用ICMP 协议定位您的计算机和目标计算机之间的所有路由器。TTL 值可以反映数据包经过的路由器或网关的数量&#xff0c;通过操纵独立ICMP 呼叫报文的TTL 值和观察该报…

Traceroute/tracert原理和实践

*本文原创作者&#xff1a;ArkTeam/YSYY&#xff0c;转载须注明来自FreeBuf.COM 一、路由追踪程序traceroute/tracert Traceroute是Linux和Mac OS等系统默认提供的路由追踪小程序&#xff0c;Tracert是Windows系统默认提供的路由追踪小程序。二者的功能相同&#xff0c;都能探…