利用SSE打造极简web聊天室

news2025/1/9 14:50:46

在B/S场景中,通常我们前端主动访问后端可以使用axios,效果很理想,而后端要访问前端则不能这样操作了,可以考虑SSE、websocket和gRPC等方式,实时和性能均有保障。
下面给出一个简单的例子,后端是node+express,前端是html+javascript(jquery+axios) 实现一个简单的web聊天室。
不说废话,直接上代码:

const stringRandom = require("string-random");

const express = require('express');
const app = express();

var msgs=[];
var clients=[];

app.use('/', express.static('./'));

app.get('/events', (req,res)=>{
	res.writeHead(200,  { 'Content-Type': 'text/event-stream', 'Connection': 'keep-alive', 'Cache-Control': 'no-cache' });
	res.write(`data: ${JSON.stringify(msgs)}\n\n`);
	let clientid=stringRandom(32, { letters: 'ABCDEF' })
	clients.push({ "clientid":clientid, "res":res });
	req.on('close', () => { clients = clients.filter(item => (item.clientid != clientid)); });
});

app.post('/sendmsg',express.json(), (req,res)=>{
	msgs.push(req.body);
	res.json({"code":200});
	clients.forEach(client=>{ client.res.write(`data: ${JSON.stringify(req.body)}\n\n`)  });
});

app.listen(3000, () => { console.log(`极简聊天室服务启动`); })
<!DOCTYPE html>
<html>
<head>
<title>极简聊天室</title>
<meta charset="utf-8">
<script src="jquery-3.6.1.min.js"></script>
<script src="axios.min.js"></script>
</head>
<body>
<input id="msg"></input><button id="send" onclick=sendmsg()>发送</button>
<ul id="msgs">
</ul>
<script>
var uid;
let reg = new RegExp("(^|&)" + "uid" + "=([^&]*)(&|$)","i");
let r = location.search.substr(1).match(reg);
uid=(r!=null)?decodeURI(r[2]):"me";

const evtSource = new EventSource("http://localhost:3000/events");

evtSource.addEventListener('message', function(event) {
	let jvar=JSON.parse(event.data);
	if (jvar instanceof Array) { 
		jvar.forEach(item=>{ $("#msgs").append(`<li>${item.uid} 说: ${item.msg}</li>`) } ) 
		}
	else { $("#msgs").append(`<li>${jvar.uid} 说: ${jvar.msg}</li>`) }
})

function sendmsg()	{ axios.post("http://localhost:3000/sendmsg",{"uid":uid,"msg":$("#msg").val()}).then(()=>$("#msg").val("")) }
</script>
</body>
</html>

浏览器访问效果如下:
在这里插入图片描述
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1969412.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

体验教程:通义灵码陪你备战求职季

本场景将带大家体验在技术面试准备场景下&#xff0c;如何通过使用阿里云通义灵码实现高效的编程算法题练习 、代码优化、技术知识查询等工作&#xff0c;帮助开发者提升实战能力&#xff0c;更加从容地应对面试挑战。主要包括&#xff1a; 1、模拟题练习&#xff1a;精心挑选…

Python基础教程(二)字符串和函数

6.字符串 6.1 字符串的表示方式 6.1.1 普通字符串 普通字符串指用单引号()或双引号(”")括起来的字符串。例如:Hello或"Hello" >>> Hello Hello >>> "Hello" Hello >>> s\u0048\u0065\u006c\u006c\u006f >>> …

Oracle19c数据库system密码锁定

一、在oracle 19c数据库中&#xff0c;cdb中system用户被锁定&#xff0c;locked 二、所在的pdb中的system用户状态是正常的&#xff0c;但不可用&#xff0c;连接的时候提示账号已锁定 三、解决 在cdb中将system用户解锁。 alter user system account unlock;

LeetCode面试150——45跳跃游戏II

题目难度&#xff1a;中等 默认优化目标&#xff1a;最小化平均时间复杂度。 Python默认为Python3。 目录 1 题目描述 2 题目解析 3 算法原理及代码实现 3.1 反向查找 3.2 正向查找 参考文献 1 题目描述 给定一个长度为 n 的 0 索引整数数组 nums。初始位置为 nums[0]…

使用 Java 8 的 BiPredicate 和 Stream API 进行数据过滤和分组

在本文中&#xff0c;我们将学习如何使用 Java 8 的 BiPredicate 和 Stream API 来进行数据过滤和分组。我们将通过一个具体的例子来演示这一过程&#xff0c;例子中包含学生成绩的筛选和基于考试时间段的分组。 案例介绍 我们有两个实体类&#xff1a;StudentScore 和 ExamT…

满客宝智慧食堂系统 selectUserByOrgId 未授权访问漏洞复现

0x01 产品简介 满客宝智慧食堂系统由正奇晟业&#xff08;北京&#xff09;科技有限公司开发&#xff0c;旨在通过科技手段提升食堂的服务水平和就餐体验。该系统支持多种食堂就餐形式&#xff0c;如自选餐、自助餐、档口就餐、预订取餐等&#xff0c;满足不同场景下的餐饮需求…

从理论到实践网络编程模型:(BIO、NIO、AIO)同步与异步模型的原理与应用 (四)

我是写Java的就用Java及所需要的基础来写的本篇文章&#xff0c;其他语言的讲解和应用暂时也不会&#xff0c;欢迎大佬在评论区指导&#xff0c;给出其他语言的讲解分析与应用 Java数据传输字符流和字节流 java.io 是 Java 编程语言中的一个包&#xff0c;主要用于输入和输出&…

Linux 和 Unix 的关系

Linux 和 Unix 的关系 2.2.1unix 是怎么来的 2.2.2Linux 是怎么来的 GNU计划的另一个目的是构建自由的软件文化&#xff0c;以支持以无条件自由软件和开放源码程序这种文化理念为核心的一整套系统&#xff0c;来推动软件在世界范围内的普及及发展。其中包括支持点&#xff08;推…

java开发环境搭建基础之2----开发工具eclipse在windows的安装

一.背景 公司安排了带徒弟任务&#xff0c;写点基础的环境搭建这些吧。搭建基础开发环境&#xff0c;主要是jdk、eclipse、git、maven、mysql。后续再考虑编写jenkins、nexus、docker、1panel等CI/CD环境搭建。本次主要内容是eclipse的下载安装及运行。我的开发环境&#xff0c…

Linux内核(4)——Linux设备文件open函数从应用到内核全过程解析

学习并整理了下open等系统调用&#xff0c;从用户态如何调用到内核态的全过程。 1.Linux内核目录总览 2.Linux文件系统与设备驱动关系 这是在Linux设备驱动开发详解里找的两张图&#xff0c;内容很形象。 当用户程序通过系统调用陷入内核态时&#xff0c;会先经过VFS&#xf…

Hive3:表操作常用语句-内部表、外部表

一、内部表 1、基本介绍 &#xff08;CREATE TABLE table_name ......&#xff09; 未被external关键字修饰的即是内部表&#xff0c; 即普通表。 内部表又称管理表,内部表数据存储的位置由hive.metastore.warehouse.dir参数决定&#xff08;默认&#xff1a;/user/hive/ware…

多线程处理

1、使用两个线程完成两个文件的拷贝&#xff0c;分支线程1拷贝前一半&#xff0c;分支线程2拷贝后一半&#xff0c;主线程回收两个分支线程的资源 #include<myhead.h>struct Buf {int start;//起始位置int end;//结束位置const char *arr;//源文件const char *brr;//目标…

Spring-component-scan标签详解

<context:component-scan base-package"cn.ybzy.springtest"/> 首先&#xff0c;这标签是需要context的命名空间的。 base-package&#xff1a; 指定spring扫描注解的类所在的包。当需要扫描多个包的时候&#xff0c;可以使用逗号分隔。 如果只希望扫描特定…

Linux防火墙2

一、SNAT和DNAT SNAT&#xff1a;让内网机器可以访问外网服务器 DNAT: 让外网机器可以访问内网服务器 1.1、SNAT原理与应用 SNAT 应用环境 局域网主机共享单个公网IP地址接入Internet (私有IP不能在Internet中正常路由)&#xff0c;私转公 SNAT原理:源地址转换&#xff0c;…

水平直逼高级病理学家!清华团队提出AI基础模型ROAM,实现胶质瘤精准诊断

胶质瘤是一种源自脑内神经胶质细胞的肿瘤&#xff0c;占据所有原发性中枢神经系统肿瘤的 40&#xff05;~60&#xff05;&#xff0c;并以成年人最常见的颅内原发性肿瘤而闻名。胶质瘤的组织病理分类非常复杂&#xff0c;通常分为三种亚型&#xff1a;星形细胞瘤、少突胶质细胞…

使用go的tls库搭建客户端服务器加密通信

文章目录 使用OpenSSL生成证书Win系统安装openssl生成证书 非HTTP 直接tcp通信服务器代码客户端代码通信效果 使用OpenSSL生成证书 Win系统安装openssl 安装地址 https://slproweb.com/products/Win32OpenSSL.html设置环境变量 cmd命令检验 openssl version 生成证书 生成C…

2024.7.28 记录一次悲惨的笔试——作业帮NLP校招

小红的奇偶抽取 题目描述 题解 #include <iostream> #include<stack> using namespace std;int main() {long long n;stack <int> ji, ou;cin >> n;while (n) {int a n % 10;if (a % 2 0)ou.push(a);elseji.push(a);n n / 10;}long long jN 0, o…

Spring Cloud中怎么使用Resilience4j Retry对OpenFeign进行重试

在微服务架构中&#xff0c;服务之间的通信是非常频繁的。而使用OpenFeign可以极大简化微服务之间的HTTP通信。但在复杂的分布式系统中&#xff0c;服务之间的调用可能会因为网络问题、服务故障等原因而失败。因此&#xff0c;实现服务调用的重试机制显得尤为重要。Resilience4…

DDR3的使用(四)利用XILINX MIGIP核(native)读写DDR3—IP核信号分析

我们这一节继续结合仿真波形和逻辑分析仪测试波形来分析下MIGIP核的各个信号使用&#xff0c;这里主要说的是用户端的信号&#xff0c;这些信号直接与ip核进行交互&#xff0c;只有正确使用才能按我们的要求来读写数据。 1.我们先打开modelsim仿真软件&#xff0c;查看下examp…