简单的聊天室

基于express+socket.io

express框架直接安装后得到模板

这是socket官网的例子: https://socket.io/get-started/chat

/*** Module dependencies.*/
var app = require('../app');
var debug = require('debug')('server:server');
var http = require('http');
const { Server } = require("socket.io");
const users = {};/*** Get port from environment and store in Express.*/var port = normalizePort(process.env.PORT || '8888');
app.set('port', port);
/*** Create HTTP server.*/var server = http.createServer(app);
// 解决跨域问题
const io = new Server(server, {allowEIO3: true,cors: {origin: "*", // from the screenshot you providedmethods: ["GET", "POST"]}
});io.on('connection', (socket) => {// 可以发送初始化消息 ---- socket.on('username', (username) => {// 用对应的 socked.id 将用户姓名存入users[socket.id] = username// 广播给所有的用户socket.broadcast.emit('welcome', `欢迎<span>${username}</span>来到聊天室`);// 传送自己socket.emit('welcome', `欢迎<span>${username}</span>来到聊天室`);})socket.on('chat message', (msg) => {socket.broadcast.emit('message', `${users[socket.id]}:${msg}`);socket.emit('message', `${users[socket.id]}:${msg}`);});
});/*** Listen on provided port, on all network interfaces.*/
server.listen(port);
server.on('error', onError);
server.on('listening', onListening);/*** Normalize a port into a number, string, or false.*/function normalizePort(val) {var port = parseInt(val, 10);if (isNaN(port)) {// named pipereturn val;}if (port >= 0) {// port numberreturn port;}return false;
}/*** Event listener for HTTP server "error" event.*/function onError(error) {if (error.syscall !== 'listen') {throw error;}var bind = typeof port === 'string'? 'Pipe ' + port: 'Port ' + port;// handle specific listen errors with friendly messagesswitch (error.code) {case 'EACCES':console.error(bind + ' requires elevated privileges');process.exit(1);break;case 'EADDRINUSE':console.error(bind + ' is already in use');process.exit(1);break;default:throw error;}
}/*** Event listener for HTTP server "listening" event.*/function onListening() {var addr = server.address();var bind = typeof addr === 'string'? 'pipe ' + addr: 'port ' + addr.port;debug('Listening on ' + bind);
};module.exports = io

html 文件

<!DOCTYPE html>
<html><head><title>Socket.IO chat</title><style>body {margin: 0;padding-bottom: 3rem;font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Helvetica, Arial, sans-serif;}#form {background: rgba(0, 0, 0, 0.15);padding: 0.25rem;position: fixed;bottom: 0;left: 0;right: 0;display: flex;height: 3rem;box-sizing: border-box;backdrop-filter: blur(10px);}#input {border: none;padding: 0 1rem;flex-grow: 1;border-radius: 2rem;margin: 0.25rem;}#input:focus {outline: none;}#form>button {background: #333;border: none;padding: 0 1rem;margin: 0.25rem;border-radius: 3px;outline: none;color: #fff;}#messages {list-style-type: none;margin: 0;padding: 0;}#messages>li {padding: 0.5rem 1rem;}#messages>li:nth-child(odd) {background: #efefef;}.hint {height: 20px;line-height: 20px;font-size: 16px;color: #333;}.hint span {color: red;}</style>
</head><body><ul id="messages"></ul><form id="form"><input id="input" autocomplete="off" /><button>Send</button></form><!-- ./node_modules/socket.io/socket.io.js --><script src="http://localhost:8888/socket.io/socket.io.js"></script><script>var socket = io('http://localhost:8888');// 获取用户名称const username = prompt('请输入您的名称')var form = document.getElementById('form');var input = document.getElementById('input');const messages = document.getElementById('messages');class Message {add(msg, cls) {messages.innerHTML += `<li class=${cls}>${msg}</li>`}}const message = new Message()// 向服务器发送用户名称socket.emit('username', username);form.addEventListener('submit', function (e) {e.preventDefault();if (input.value) {socket.emit('chat message', input.value);input.value = '';}});socket.on('message', (msg) => {message.add(msg)})socket.on('welcome', (msg) => {console.log('触发自己')message.add(msg, 'hint')})</script>
</body></html>

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

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

相关文章

Linux 中如何获取文件的绝对路径

我们都知道&#xff0c;在命令行可以使用 pwd 命令来获取当前目录的完整路径&#xff08;绝对路径&#xff09;&#xff1a;pwd那么&#xff0c;如何获取文件的绝对路径呢&#xff1f;有下列几种方法&#xff0c;可以打印文件的完整路径&#xff1a;readlinkrealpathfindls 和 …

EasyCV开源|开箱即用的视觉自监督+Transformer算法库

简介&#xff1a;EasyCV是阿里巴巴开源的基于Pytorch&#xff0c;以自监督学习和Transformer技术为核心的 all-in-one 视觉算法建模工具。EasyCV在阿里巴巴集团内支撑了搜索、淘系、优酷、飞猪等多个BU业务&#xff0c;同时也在阿里云上服务了若干企业客户&#xff0c;通过平台…

开源数据库为什么能捕获开发者的心?

【CSDN 编者按】开源数据库的重要性&#xff0c;早就不言而喻。早期的自由软件开发者和初创公司&#xff0c;很多都受益于开源数据库。伴随着曾经的初创公司羽翼逐渐丰满&#xff0c;它们的开发者文化渗透到整个生态系统中&#xff0c;更多的人开始关注这些初创公司采取的方法&…

react+umi+dva+ts基础基础使用

官网链接 umidva 文件目录 page 页面 index.tsx models 每一个model文件都是需要挂在dva实例上的才会生效demo.ts sevices 写接口的&#xff08;这里就不写了&#xff09;demo.ts实现一个简单的数据流向&#xff0c;将数据存储到dva&#xff0c;然后在页面使用 page/inde…

“消息驱动、事件驱动、流 ”基础概念解析

简介&#xff1a;本文旨在帮助大家对近期消息领域的高频词“消息驱动&#xff08;Message-Driven&#xff09;&#xff0c;事件驱动&#xff08;Event-Driven&#xff09;和流&#xff08;Streaming&#xff09;”有更清晰的了解和认知&#xff0c;其中事件驱动 EDA 作为 Gartn…

KubeVela 1.3 发布:开箱即用的可视化应用交付平台,引入插件生态、权限认证、版本化等企业级新特性

简介&#xff1a;得益于 KubeVela 社区上百位开发者的参与和 30 多位核心贡献者的 500 多次代码提交&#xff0c; KubeVela 1.3 版本正式发布。相较于三个月前发布的 v1.2 版本[1]&#xff0c;新版本在 OAM 核心引擎&#xff08;Vela Core&#xff09;&#xff0c;可视化应用交…

非常简单的清除axios请求(vue,react通用)

1、添加js文件 实现添加与删除接口的功能。 import axios from axiosclass CancelToken {// 声明一个 Map 用于存储每个请求的标识 和 取消函数static pending new Map()// 白名单, 写入接口名称static whiteRequest []/*** 得到该格式的url* param {AxiosRequestConfig} con…

阿里云发布企业云原生IT成本治理方案:五大能力加速企业 FinOps 进程

简介&#xff1a;阿里云企业云原生 IT 成本治理方案助力企业落地企业 IT 成本治理的理念、工具与流程&#xff0c;让企业在云原生化的过程中可以数字化地实现企业 IT 成本管理与优化&#xff0c;成为 FinOps 领域的践行者与领先者。 作者&#xff1a;莫源 云原生技术与降本增…

阿里云数字化安全生产平台 DPS V1.0 正式发布

简介&#xff1a;数字化安全生产平台则帮助客户促进业务与 IT 的全面协同&#xff0c;从业务集中监控、业务流程管理、应急指挥响应等多维度来帮助客户建立完善专业的业务连续性保障体系。 作者&#xff1a;银桑、比扬 阿里云创立于 2009 年&#xff0c;是全球领先的云计算及…

项目实用功能-全局loading动画

1.为设么要使用全局loading 调用的每一个接口都要绑定一个loading真的很烦。 2.实现这个需要考虑哪些要素 首先全局的loading需要一个调用任何接口都要执行的地方打开&#xff0c;那就肯定是axios的前置拦截函数了。loading有加载整个页面的&#xff0c;也有加载部分页面的&…

玩转小程序压测

简介&#xff1a;小程序是移动互联网时代非常重要的流量入口。为了避免因系统性能瓶颈导致用户在使用过程中出现白屏、异常报错等问题影响用户体验&#xff0c;小程序在新功能上线前需要做好压力测试&#xff0c;评估出系统的承载能力&#xff0c;并以压测结果配置限流。让系统…

好的每日站会,应该这么开 | 敏捷开发落地指南

简介&#xff1a;高效落地敏捷开发&#xff0c;先从这3个关键活动着手。在敏捷迭代中&#xff0c;虽然迭代周期比较短&#xff0c;但依然需要对迭代过程进行有效跟进。如果在输入、过程、输出环节&#xff0c;没有要求&#xff0c;每日站会&#xff08;迭代跟进&#xff09;将会…

EasyNLP开源|中文NLP+大模型落地,EasyNLP is all you need

简介&#xff1a;EasyNLP背后的技术框架如何设计&#xff1f;未来有哪些规划&#xff1f;今天一起来深入了解。 作者 | 临在、岑鸣、熊兮 来源 | 阿里开发者公众号 一 导读 随着BERT、Megatron、GPT-3等预训练模型在NLP领域取得瞩目的成果&#xff0c;越来越多团队投身到超大…

虚拟列表的实现思路(附带react代码)

虚拟列表实现思路 —— 代码链接 <div class"滚动容器"><div class"撑起列表正常高度"></div><div class"列表容器"><div class"列表项"></div></div> </div>1.【列表项】的高度确定…

内容社区行业搜索最佳实践

简介&#xff1a;社区内容通常包括UGC和PGC。由于关键词和内容多样性丰富、用词规范程度参差不齐&#xff0c;搜索引擎需要对关键词和内容进行智能语义分析&#xff0c;识别出用户真正的查询意图&#xff0c;找到最全面最相关的结果满足用户需求。本文将详细介绍如何通过“开放…

手把手,带你用数据做好迭代复盘改进 | 敏捷开发落地指南

简介&#xff1a;高效落地敏捷开发&#xff0c;先从这3个关键活动着手。带你用数据做好迭代复盘改进 &#xff0c;数据说话&#xff0c;借助云效项目协作Projex 高效开展迭代复盘高效落地敏捷开发。 摘要&#xff1a;高效落地敏捷开发&#xff0c;先从这3个关键活动着手&#…

记一次网络相关的技术问题答疑

大家好&#xff0c;我是飞哥&#xff01;前段时间飞哥参加了一期 OSChina 官方举办的「高手问答」栏目。在这个栏目里&#xff0c;我和 OSChina 的网友们以《深入理解 Linux 网络》为主题&#xff0c;对大家日常所关心的一些问题展开了一些技术探讨。今天我把这个活动中探讨的内…

Hexo博客框架—轻量、一令部署

简介&#xff1a;Hexo 是一个快速、简洁且高效的博客框架。Hexo 使用 Markdown&#xff08;或其他渲染引擎&#xff09;解析文章&#xff0c;在几秒内&#xff0c;即可利用靓丽的主题生成静态网页。Hexo支持Github Flavored Markdown的所有功能, 甚至可以整合Octopress的大多数…

被你质疑价值的混沌工程,阿里巴巴已落地实践了9年

简介&#xff1a;无可讳言&#xff0c;对于混沌工程的价值&#xff0c;目前在业内还没有一个明确的度量标准&#xff0c;但是可以通过简单的例子来有效佐证。据中亭介绍&#xff0c;一方面可以先选定一个场景&#xff0c;从结果上看&#xff0c;混沌工程可以保证场景不劣化&…

同为博客,不同风格 ——Hexo另类搭建

简介&#xff1a;通过阿里云云开发平台快速由Hexo创建赛博朋克风格的博客。 一 、通过云开发平台快速创建初始化应用 1.创建相关应用模版请参考链接&#xff1a;Hexo博客框架—轻量、一令部署 2.完成创建后就可以在github中查看到新增的Hexo仓库 二 、 本地编写《赛博朋克风…