当前位置: 首页 > news >正文

websocket实现简易聊天室

websocket实现简易聊天室

又做了一个关于websocket广播和在线人数统计的练习,实现一个简易的聊天室。

前端vue3

前端里的内容主要包含:
1.css的animation来实现公告从右到左的轮播。
2.websocket的onmessage里对不同消息的处理。

<template><div class="common-layout"><el-container><el-header><el-row><el-col :span="1"><div>公告:</div></el-col><el-col :span="20"><div class="scroll-container"><div class="text-scroll">公告信息</div></div></el-col><el-col :span="3" class="paddingleft20">在线人数:<span class="spanTip">{{onlineCount}}</span></el-col></el-row></el-header><el-container><el-aside><el-row v-for="(item, index) in onlineUsers" :key="index"><span class="onlinespan">{{item}}</span></el-row></el-aside><el-container><el-main v-html="othermessage"></el-main><el-footer><el-row><el-col :span="22"><el-input v-model="this.message" :rows="2" resize="none" type="textarea" @keyup.enter="sendMessage()"/></el-col><el-col :span="2" class="center"><el-button type="primary" @click="sendMessage()">发送</el-button></el-col></el-row></el-footer></el-container></el-container></el-container></div>
</template><script >
import { ref } from 'vue';
const socket = new WebSocket('ws://localhost:8080/chartroom');
const othermessage=ref('')
const onlineCount=ref(0)
const onlineUsers=ref([])
const own=ref('')
export default {name: 'Chart-Room',components: {},data(){return{message:'',othermessage,onlineCount,onlineUsers,own}},mounted(){this.connect();},unmounted(){this.beforeDestroy();},methods:{connect() {socket.onopen = function() {};socket.onmessage = function(event) {if(event.data.indexOf('onlineCount:')>-1){onlineCount.value=event.data.split(':')[1]}else if(event.data.indexOf('onlineUsers:')>-1){var userStr=event.data.split(':')[1];onlineUsers.value=userStr.split(',')}else if(event.data.indexOf('own')>-1){own.value=event.data.split(':')[1]}else{othermessage.value += "<div>"+event.data+"</div>"}};socket.onerror = function(event) {console.error('WebSocket error observed:', event);};},beforeDestroy() {if (socket) {socket.close();}},sendMessage() {if (socket.readyState === WebSocket.OPEN) {socket.send(own.value+":"+this.message);this.message=""}},}
}
</script><style scoped>.el-header{background-color:rgb(164, 172, 184);color: rgb(252, 252, 252);text-align: left;padding: 10px 15px;height:40px;}.el-aside{background-color:rgb(204, 209, 214);width:180px;height: 300px;}.el-main{background-color:rgb(246, 250, 253);padding: 10px 10px;white-space: pre-wrap;font-size: 14px;}.el-footer{margin:0px;padding:3px 3px;background-color:rgb(237, 241, 245);}.center{text-align: center;padding: 10px 5px;}.scroll-container {overflow: hidden;white-space: nowrap;text-align: right;}.text-scroll {display: inline-block;/** 实现从右到左的动画效果 */animation: scroll-right 30s linear infinite;}@keyframes scroll-right {0% {transform: translateX(100%);}100% {transform: translateX(-100%);}}.paddingleft20{padding-left: 20px;}.spanTip{color: rgb(252, 229, 179);}.onlinespan{margin:10px;color: rgb(85, 106, 128);}
</style>

后端java+mongodb

1.config配置

@Configuration
@EnableWebSocket
public class ChartConfig implements WebSocketConfigurer {@Overridepublic void registerWebSocketHandlers(WebSocketHandlerRegistry registry) {registry.addHandler(chartHandler(), "/chartroom").setAllowedOrigins("*"); // 允许跨域}@Beanpublic ChartHandler chartHandler() {return new ChartHandler();}
}

2.处理连接成功后增加在线人数、断开连接后减少在线人数以及广播和单独发送消息。

public class ChartHandler extends TextWebSocketHandler {private static final Set<WebSocketSession> sessionsSet = Collections.synchronizedSet(new HashSet<>());/*** 接收消息*/@Overridepublic void handleTextMessage(WebSocketSession session, TextMessage message) throws IOException {//记录到mongodbMap<String, String> map = new HashMap<>();map.put("time", new Date().toString());String msg=message.getPayload().trim();map.put("message", msg.split(":")[1]);SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMdd");String currentDate = sdf.format(new Date());MongoDBUtil.insertContent(currentDate, msg.split(":")[0], map);// 发送消息给客户端sendMessageToAll(message.getPayload());}/*** 连接后的处理*/@Overridepublic void afterConnectionEstablished(WebSocketSession session) throws Exception {sessionsSet.add(session);sendMessageToAll("onlineCount:" + sessionsSet.size());sendMessageToAll("onlineUsers:" + getListUsers());session.sendMessage(new TextMessage("own:【游客】"+session.getId().substring(0, 8)));}/*** 获取在线用户列表*/private String getListUsers() {List<String> usersList = new ArrayList<>();for(WebSocketSession item : sessionsSet){String userName="【游客】"+item.getId().substring(0, 8);if(!usersList.contains(userName)){usersList.add(userName);}}return String.join(",", usersList);}/*** 关闭连接后的处理*/@Overridepublic void afterConnectionClosed(WebSocketSession session, CloseStatus closeStatus) throws Exception {sessionsSet.remove(session);sendMessageToAll("onlineCount:" + sessionsSet.size());sendMessageToAll("onlineUsers:" + getListUsers());}/*** 广播发送消息*/private void sendMessageToAll(String message) {sessionsSet.forEach(item -> {try {item.sendMessage(new TextMessage(message));} catch (IOException e) {e.printStackTrace();}});}
}

相关文章:

websocket实现简易聊天室

websocket实现简易聊天室 又做了一个关于websocket广播和在线人数统计的练习&#xff0c;实现一个简易的聊天室。 前端vue3 前端里的内容主要包含&#xff1a; 1.css的animation来实现公告从右到左的轮播。 2.websocket的onmessage里对不同消息的处理。 <template>&l…...

vulhub-wordpress

1.打开wordpress关卡&#xff0c;选择简体中文 添加信息——点击安装WordPress 安装完成——登录 点击外观——编辑主题 可以加入一句话木马&#xff0c;但是我写入的是探针文件 也可以去上传一个带有木马的主题 上传之后会自动解压 1.php就是里面的木马文件...

【机器学习算法基础】(基础机器学习课程)-10-逻辑回归-笔记

一、模型的保存与加载 逻辑回归是一种常见的机器学习算法&#xff0c;广泛用于分类问题。为了在不同的时间或环境下使用训练好的模型&#xff0c;我们通常需要将其保存和加载。 保存模型 训练模型&#xff1a;首先&#xff0c;你需要用你的数据训练一个逻辑回归模型。例如&…...

自动驾驶行业知识汇总

应届生月薪2W的自动驾驶开发、机器人、后端开发&#xff0c;软件开发该如何学习相关技术栈_哔哩哔哩_bilibili 两万字详解自动驾驶开发工具链的现状与趋势 (qq.com) 九章智驾 - 2023年度文章大合集 (qq.com) 九章 - 2022年度文章大合集 (qq.com)...

C#根据反射操作对象

前言 反射使用&#xff0c;让我们的程序可以动态增加一些功能&#xff0c;让原本固化的步骤逻辑变得动态&#xff0c;这是它的优点。当然使用反射首次加载会有性能损耗以及使用复杂&#xff1b;但是现在大家都在讲动态&#xff0c;使用好它应该是一个重要的编程理念提升。MVC、…...

打包python脚本(flask、jinja2)为exe文件

20240803 概述 在我很早时候学习python的时候&#xff0c;就利用过某个工具将其打包为exe文件&#xff0c;然后在没有python环境的机器上运行&#xff0c;这样可以减少安装python环境和各种库的过程。 最近在开发一个在虚拟机上运行的程序的时候就遇到了打包一些环境的问题&…...

嵌入式初学-C语言-练习三

#部分题目可能在之前的博客中有&#xff0c;请谅解&#xff0c;保证常见题型均被发出# 1.计算n以内所有正奇数的和 ? n值通过键盘输入 代码&#xff1a; 1 /*2 需求&#xff1a;计算n以内所有正奇数的和 ? n值通过键盘输入3 */4 #include <stdio.h>5 6 int main()7 …...

最新版Sonible Plugins Bundle v2024 winmac,简单智能,持续更新长期有效

一。Sonible Plugins Bundle v2024 win&mac Sonible Plugins Bundle是一款以创作者为中心的智能音频插件系列。这些工具的特点是易于使用&#xff0c;搭配高级处理和优质音质。pure:bundle的所有插件都由sonible的智能插件系列中使用的技术驱动&#xff0c;但在设计时考虑到…...

J032_实现简易版的B/S架构

一、需求描述 实现简易版的B/S架构 1.1 Server package com.itheima.tcp4;import java.io.IOException; import java.net.ServerSocket; import java.net.Socket; import java.util.concurrent.ArrayBlockingQueue; import java.util.concurrent.Executors; import java.uti…...

【前端面试】五、框架

目录 1 Vue2 2 Vue3 3 React 4 Angular 1 Vue2 Vue2 是目前仍被广泛使用的前端框架之一&#xff0c;其特点包括响应式数据绑定、组件化开发等。 响应式系统&#xff1a;Vue2 使用 Object.defineProperty 来实现数据的响应式。每个组件实例在创建时&#xff0c;会将 dat…...

C语言 | Leetcode C语言题解之第316题去除重复字母

题目&#xff1a; 题解&#xff1a; char* removeDuplicateLetters(char* s) {int vis[26], num[26];memset(vis, 0, sizeof(vis));memset(num, 0, sizeof(num));int n strlen(s);for (int i 0; i < n; i) {num[s[i] - a];}char* stk malloc(sizeof(char) * 27);int stk…...

本地部署 Llama-3-EvoVLM-JP-v2

本地部署 Llama-3-EvoVLM-JP-v2 0. 引言1. 关于 Llama-3-EvoVLM-JP-v22. 本地部署2-0. 克隆代码2-1. 安装依赖模块2-2. 创建 Web UI2-3.启动 Web UI2-4. 访问 Web UI 0. 引言 Sakana AI 提出了一种称为进化模型合并的方法&#xff0c;并使用该方法创建大规模语言模型&#xff…...

Evaluating the Generation Capabilities of Large Chinese Language Models

文章目录 题目摘要相关工作CG-Eval实验 题目 评估大型中文语言模型的生成能力 论文地址&#xff1a;https://arxiv.org/abs/2308.04823 项目地址&#xff1a;http://cgeval.besteasy.com/ 摘要 本文介绍了 CG-Eval&#xff0c;这是有史以来第一个全面的自动化评估框架&#xf…...

YOLOv8添加注意力模块并测试和训练

YOLOv8添加注意力模块并测试和训练 参考bilibili视频 yolov8代码库中写好了注意力模块&#xff0c;但是yolov8的yaml文件中并没用使用它&#xff0c;如下图的通道注意力和空间注意力以及两者的结合CBAM&#xff0c;打开conv.py文件可以看到&#xff0c;其中包含了各种卷积块的…...

「Unity3D」自动布局LayoutElement、ContentSizeFitter、AspectRatioFitter、GridLayoutGroup

布局元素与布局控制器 布局元素实现ILayoutElement接口&#xff0c;布局控制器实现ILayoutController接口&#xff0c;后者根据前者的属性控制具体布局——有些布局控制器也是布局元素&#xff0c;即同时实现这两个接口&#xff0c;如LayoutGroup。 public interface ILayout…...

【Golang 面试 - 进阶题】每日 3 题(十六)

✍个人博客&#xff1a;Pandaconda-CSDN博客 &#x1f4e3;专栏地址&#xff1a;http://t.csdnimg.cn/UWz06 &#x1f4da;专栏简介&#xff1a;在这个专栏中&#xff0c;我将会分享 Golang 面试中常见的面试题给大家~ ❤️如果有收获的话&#xff0c;欢迎点赞&#x1f44d;收藏…...

Redis2

为什么Redis要给缓存数据设置过期时间&#xff1f; 内存是有限的&#xff0c;如果缓存中的所有数据都是一直保存&#xff0c;很容易OOM Redis如何判断数据是否过期&#xff1f; 通过过期字典来保存数据的过期时间 过期删除策略 Redis采用的是定期删除惰性删除 Redis内存淘…...

C语言--函数

1. 函数定义 语法&#xff1a; 类型标识符 函数名&#xff08;形式参数&#xff09; {函数体代码 } &#xff08;1&#xff09;类型标识符 --- 数据类型&#xff08;函数要带出的结果的类型&#xff09; 注&#xff1a;数组类型不能做函数返回结果的类型&#xff0c;如果函…...

Shell 编程的高级技巧和实战应用

第一步&#xff1a;高级函数和模块化设计 1.1 高级函数设计 探讨函数的参数处理和默认值设置。示例&#xff1a;实现一个可以处理可选参数的函数。 #!/bin/bashgreet() {local name${1:-"World"} # 如果没有提供参数&#xff0c;使用默认值 "World"ech…...

VMWare虚拟机如何连接U盘

检查配置 1&#xff09;Win R键&#xff0c;输入services.msc&#xff0c;打开服务。 2&#xff09;将AMware USB Arbitration Services 服务开启&#xff0c;并设置为自动启动&#xff1b; 连接U盘 目前作者了解有两种连接方式&#xff0c;如有其他连接方式&#xff0c;欢…...

SkyWalking 10.2.0 SWCK 配置过程

SkyWalking 10.2.0 & SWCK 配置过程 skywalking oap-server & ui 使用Docker安装在K8S集群以外&#xff0c;K8S集群中的微服务使用initContainer按命名空间将skywalking-java-agent注入到业务容器中。 SWCK有整套的解决方案&#xff0c;全安装在K8S群集中。 具体可参…...

家政维修平台实战20:权限设计

目录 1 获取工人信息2 搭建工人入口3 权限判断总结 目前我们已经搭建好了基础的用户体系&#xff0c;主要是分成几个表&#xff0c;用户表我们是记录用户的基础信息&#xff0c;包括手机、昵称、头像。而工人和员工各有各的表。那么就有一个问题&#xff0c;不同的角色&#xf…...

学习STC51单片机31(芯片为STC89C52RCRC)OLED显示屏1

每日一言 生活的美好&#xff0c;总是藏在那些你咬牙坚持的日子里。 硬件&#xff1a;OLED 以后要用到OLED的时候找到这个文件 OLED的设备地址 SSD1306"SSD" 是品牌缩写&#xff0c;"1306" 是产品编号。 驱动 OLED 屏幕的 IIC 总线数据传输格式 示意图 …...

【android bluetooth 框架分析 04】【bt-framework 层详解 1】【BluetoothProperties介绍】

1. BluetoothProperties介绍 libsysprop/srcs/android/sysprop/BluetoothProperties.sysprop BluetoothProperties.sysprop 是 Android AOSP 中的一种 系统属性定义文件&#xff08;System Property Definition File&#xff09;&#xff0c;用于声明和管理 Bluetooth 模块相…...

Cloudflare 从 Nginx 到 Pingora:性能、效率与安全的全面升级

在互联网的快速发展中&#xff0c;高性能、高效率和高安全性的网络服务成为了各大互联网基础设施提供商的核心追求。Cloudflare 作为全球领先的互联网安全和基础设施公司&#xff0c;近期做出了一个重大技术决策&#xff1a;弃用长期使用的 Nginx&#xff0c;转而采用其内部开发…...

什么是Ansible Jinja2

理解 Ansible Jinja2 模板 Ansible 是一款功能强大的开源自动化工具&#xff0c;可让您无缝地管理和配置系统。Ansible 的一大亮点是它使用 Jinja2 模板&#xff0c;允许您根据变量数据动态生成文件、配置设置和脚本。本文将向您介绍 Ansible 中的 Jinja2 模板&#xff0c;并通…...

HashMap中的put方法执行流程(流程图)

1 put操作整体流程 HashMap 的 put 操作是其最核心的功能之一。在 JDK 1.8 及以后版本中&#xff0c;其主要逻辑封装在 putVal 这个内部方法中。整个过程大致如下&#xff1a; 初始判断与哈希计算&#xff1a; 首先&#xff0c;putVal 方法会检查当前的 table&#xff08;也就…...

高效线程安全的单例模式:Python 中的懒加载与自定义初始化参数

高效线程安全的单例模式:Python 中的懒加载与自定义初始化参数 在软件开发中,单例模式(Singleton Pattern)是一种常见的设计模式,确保一个类仅有一个实例,并提供一个全局访问点。在多线程环境下,实现单例模式时需要注意线程安全问题,以防止多个线程同时创建实例,导致…...

Fabric V2.5 通用溯源系统——增加图片上传与下载功能

fabric-trace项目在发布一年后,部署量已突破1000次,为支持更多场景,现新增支持图片信息上链,本文对图片上传、下载功能代码进行梳理,包含智能合约、后端、前端部分。 一、智能合约修改 为了增加图片信息上链溯源,需要对底层数据结构进行修改,在此对智能合约中的农产品数…...

Linux离线(zip方式)安装docker

目录 基础信息操作系统信息docker信息 安装实例安装步骤示例 遇到的问题问题1&#xff1a;修改默认工作路径启动失败问题2 找不到对应组 基础信息 操作系统信息 OS版本&#xff1a;CentOS 7 64位 内核版本&#xff1a;3.10.0 相关命令&#xff1a; uname -rcat /etc/os-rele…...