html做群聊通讯方法,websocket学习和群聊实现

2023-11-01

WebSocket协议可以实现前后端全双工通信,从而取代浪费资源的长轮询。在此协议的基础上,可以实现前后端数据、多端数据,真正的实时响应。在学习WebSocket的过程中,实现了一个简化版群聊,过程和代码详细记录在这篇文章中。

1 概述

1.1 WebSocket 是什么?

建立在 TCP 协议之上的网络通信协议

全双工通信协议

没有同源限制

可以发送文本、二进制数据等

1.2 为什么需要 WebSocket?

了解计算机网络协议的人,应该都知道:HTTP 协议是一种无状态的、无连接的、单向的应用层协议。它采用了请求/响应模型。通信请求只能由客户端发起,服务端对请求做出应答处理。

这种通信模型有一个弊端:HTTP 协议无法实现服务器主动向客户端发起消息。

因此,如果在客户端想实时监听服务器变化,必须使用 ajax 来进行轮询,效率低,浪费资源。

而 websocket 就可以使得前后端进行全双工通信(两方都可以向对方进行数据推送),是真正的平等对话。

2 WebSocket 客户端

支持HTML5的浏览器支持 WebSocket 协议:

var ws = new WebSocket(url); // 创建一个websocket对象

2.1 WebSocket 属性

专注前端与算法的系列干货分享,欢迎关注(¬‿¬):

「微信公众号:心谭博客」| xin-tan.com | GitHub

属性

描述

ws.readyState

只读属性 readyState 表示连接状态,可以是以下值:0 - 表示连接尚未建立。1 - 表示连接已建立,可以进行通信。2 - 表示连接正在进行关闭。3 - 表示连接已经关闭或者连接不能打开。

ws.bufferedAmount

只读属性 bufferedAmount 已被 send() 放入正在队列中等待传输,但是还没有发出的 UTF-8 文本字节数。

2.2 WebSocket 方法

属性

描述

ws.send()

数据发送

ws.close()

关闭连接

2.3 Websocket 事件

属性

描述

open

连接建立触发

message

通信时触发

error

出错触发

close

关闭连接触发

2.4 代码实现

假设我们在本地8080端口打开了websocket服务,那么,下面代码可以在浏览器中实现和这个服务的通信:

var ws = new WebSocket("ws://localhost:8080/");

// 建立连接触发

ws.onopen = function () {

ws.send("open ws");

console.log("open ws");

};

// 接收服务端数据触发

ws.onmessage = function (evt) {

var data = evt.data;

console.log("Data is ", data);

};

// 断开连接触发

ws.onclose = function () {

console.log("close ws");

};

3 WebSocket 服务端

关于服务端实现,根据技术选型不同,可以选用不同的库和包。我这里使用的是node的ws库来websocket服务端。

在阮一峰的博文提到的socket.io库,在浏览器端的写法不兼容原生API,准确来说,它们自己实现了一套websocket。所以,使用的时候前后端都应该引用第三方库。这样就造成了代码迁移性,严重下降。

综上所述,ws库有以下优点:

兼容性好,兼容浏览器原生API

长期维护,效果稳定

使用方便(往下看就知道了)

4 实现群聊

4.1 群聊 服务端实现

首先,在命令行中,安装ws库: npm install ws --save

现在,利用ws来实现一个监听8080端口的websocket服务器,讲解都在代码注释里,一目了然:

const PORT = 8080; // 监听端口

const WebSocket = require("ws"); // 引入 ws 库

const wss = new WebSocket.Server({ port: PORT }); // 声明wss对象

/**

* 向除了本身之外所有客户端发送消息,实现群聊功能

* @param {*} data 要发送的数据

* @param {*} ws 客户端连接对象

*/

wss.broadcastToElse = function broadcast(data, ws) {

wss.clients.forEach(function each(client) {

if (client !== ws && client.readyState === WebSocket.OPEN) {

client.send(data);

}

});

};

/* 客户端接入,触发 connection */

wss.on("connection", function connection(ws, req) {

let ip = req.connection.remoteAddress; // 通过req对象可以获得客户端信息,比如:ip,headers等

/* 客户端发送消息,触发 message */

ws.on("message", function incoming(message) {

ws.send(message); // 向客户端发送消息

wss.broadcastToElse(message, ws); // 向 其他的 客户端发送消息,实现群聊效果

});

});

4.2 群聊 客户端实现

为了方便编写,这里引入了jquery和bootstrap这两个库,只需要关注js代码即可。

群聊

发送

var userName = parseInt(Math.random() * 1000, 10) // 随机用户名, 以标识身份

var sendBtn = $("#send-btn"), // 发送信息按钮

chatInput = $("#chat-input"), // 聊天信息输入框

showArea = $("#show-area") // 聊天信息展示框

var ws = new WebSocket("ws://localhost:8080/") // 初始化WebSocket对象

sendBtn.on("click", function () {

var content = chatInput.val()

if (content.length === 0) {

return alert("请不要输入空白内容")

}

content = "At " + (new Date()).toString() + "\n" + "来自用户" + userName + "\n" + content // 拼接用户信息、时间信息和消息

ws.send(content) // 发送消息

chatInput.val("") // 清空输入框

})

ws.onopen = function () { console.log("Conncet open") }

ws.onmessage = function (evt) {

var data = evt.data

showArea.val(showArea.val() + data + "\n\n") // 刷新聊天信息展示框:显示群聊信息

}

ws.onclose = function () { console.log("Connect close") }

4.3 群聊 效果展示

首先启动我们的服务端代码:node server.js 。其中,server.js是放置服务端代码的文件。

然后,我们打开2次编写的html代码,这相当于,打开2个客户端。来检测群聊功能。

d9a9449e7d52?utm_campaign=maleskine&utm_content=note&utm_medium=seo_notes&utm_source=recommendation

效果图

5. 相关资料

专注前端与算法的系列干货分享,欢迎关注(¬‿¬)

d9a9449e7d52?utm_campaign=maleskine&utm_content=note&utm_medium=seo_notes&utm_source=recommendation

image

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

html做群聊通讯方法,websocket学习和群聊实现 的相关文章

  • Openresty(二十一)ngx.balance和balance_by_lua灰度发布

    一 openresty实现灰度发布 灰度发布 说明 早期 博客对 灰度 发布的 概念 进行解读 并且对 原生 nginx 灰度实现进行讲解 后续 主要拿 节点引流 的灰度发布 并且关注 gray灰度策略 相关借鉴 回顾HTTP反向代理流程
  • idea创建springboot项目和springcloud项目方法

    一 创建springboot项目 1 选择File gt New gt Project gt Spring Initialer gt 点击Next 2 填写项目相关的信息 gt 点击next 3 选择web gt web gt 点击next
  • 利用PyCharm操作Github(二):分支新建、切换、合并、删除

    在文章利用PyCharm操作Github 仓库新建 更新 代码回滚中 我们已经学习到了如何利用PyCharm来操作Github 其中包括了一些常见的Github操作 仓库的新建 更新以及代码回滚 在本文中 我们将介绍Git的另一部分的常见操
  • LVS+Keepalived 实现高可用负载均衡

    一 Keepalived介绍 keepalived是在Linux系统下的一个轻量级的高可用解决方案 是使用C语言编写的 在 Keepalived 中实现了一组检查器 可以根据服务集群中服务器的健康状态 自动的进行动态主备切换 管理 VRRP
  • python用支持向量机回归(SVR)模型分析用电量预测电力消费

    最近我们被客户要求撰写关于支持向量机回归的研究报告 包括一些图形和统计输出 本文描述了训练支持向量回归模型的过程 该模型用于预测基于几个天气变量 一天中的某个小时 以及这一天是周末 假日 在家工作日还是普通工作日的用电量 视频 支持向量机S
  • 高德+vue Object3DLayer强制刷新后找不到的问题

    报错错误展示 解决方式一 1 重构plugin AMap plugin AMap Object3DLayer AMap Object3D function nowStatus true 强制刷新后plugin并没有添加上 Object3DL
  • python如何制作地图热力图

    小白来学python如何制作地图热力图 图片可能看不太清楚 可以看我的知乎链接来源https zhuanlan zhihu com p 85824404 作为一个小白 最近花了好长时间研究如何制作热力图 终于做出来啦 过程如下 总体思路 收
  • spring mvc配置cas客户端

    1 在WEB INF lib中导入cas jar包 点击打开链接 2 导入证书 1 将证书server cer文件拷贝至业务系统所在服务器上的某路径下 如c盘根目录 在cmd命令界面切换至证书所在路径 执行以下命令 jdk路径自行修改 并信
  • 浅谈C++的sort函数用法

    目录 sort简介 一 默认排序 二 参数排序 三 自定义排序规则 四 排序字符数组 sort简介 头文件为algorithm 其排序方式类似于快速排序 比冒泡选择之类的小杂鱼高级 函数调用形式为 sort 参数a 参数b 参数c 参数a是
  • 华为OD机试真题-二元组个数【2023.Q1】

    题目描述 给定两个数组a b 若a i b j 则称 i j 为一个二元组 求在给定的两个数组中 二元组的个数 输入描述 第一行输入 m 第二行输入m个数 表示第一个数组 第三行输入 n 第四行输入n个数 表示第二个数组 输出描述 二元组个
  • Python利用情感词典做情感分析

    情感分析是大数据时代常见的一种分析方法 多用于对产品评论的情感挖掘 以探究顾客的满意度程度 在做情感分析时 有两种途径 一种是基于情感词典的分析方法 一种是基于机器学习的方法 两者各有利弊 在此 笔者主要想跟大家分享基于python平台利用
  • 区块链发展面临三大挑战

    区块链技术最近几年在世界范围一直是个热门话题 这种 热 源自于区块链的确是有很多优势的技术 它呈现出美好的前景 但同时也因为区块链发展会带来非常大的挑战 而且这种挑战可以说是历史性的 那么区块链会带来哪些挑战呢 我觉得主要有以下三个方面 第
  • 基于Qt的OpenGL编程(3.x以上GLSL可编程管线版)---(十六)实例化

    Vries的原教程地址如下 https learnopengl cn github io 04 20Advanced 20OpenGL 10 20Instancing 关于实例化的详细设置介绍与设置与参数设置请查看这个教程 本篇旨在对Vir
  • C++的嵌套依赖别名(typename的用法)

    看了很多遍 还是记录一下 1 在模板声明时typename和class是等价的 template
  • PyTorch训练时准确率不变

    今天复现了文章中的一个模型 刚开始学习率lr 0 01 准确率总是为20 分类目标有5个类 基本不变 刚开始我以为给模型的数据传错了 或者模型的处理有那个步骤有问题 最终多次尝试后 发现把学习率降低 结果就有效了 如我把学习率降低为lr 0
  • 我所钟爱的电影之二-公路片

    我爱公路片 人生只不过一次流浪 命运之途中 沿途风景或许都会遗忘 咫尺和遥远或许就在一瞬间 逝去的我们会怀念 一辈子就是活着的每一天 也许我不能环游世界 但幸好这个世界上有电影可以带我去 不管出走的初衷为何 在途中我们都会遇见爱 只因我们在
  • Selenium六 find_element_by_xpath()的几种方法

    Xpath XML Path Language 是W3C定义的用来在XML文档中选择节点的语言 一 从根目录 开始 有点像Linux的文件查看 代表根目录 一级一级的查找 直接子节点 相当于css selector中的 gt 号 html
  • SpringCloudAlibaba - Seata (2) AT 模式源码分析

    seata AT 模式的业务零侵入性 依靠的就是自动装配 starter 包 1 如何开启的全局事务 实现核心为 SeataAutoConfiguration 注入的 GlobalTransactionScanner Conditional
  • Qt 开发应用--颜色选择器ColorCopy

    Qt 开发应用 颜色选择器ColorCopy Qt颜色选择器 提供10大类100种颜色可选 点击即为复制 随处 Ctrl V 粘贴使用 提供有 Red Pink Purple Indigo Blue Green Yellow Orange

随机推荐

  • 进程和线程以及协程

    1 基本概念 进程和线程 进程 是系统资源分配的基本单位 实现了操作系统的并发 线程 是CPU调度的基本单位 实现了进程内的并发执行 并发是把任务在不同的时间点交给处理器进行处理 在同一时间点 任务并不会同时运行 并行是把每一个任务分配给每
  • 个人经济学管理tips

    摘录一些观点 作为茶余饭后的谈资 不清楚自己的热爱和目标时 每天把头脑最清醒的1小时留给自己 学习 思考 3个小时陪伴家人 剩下的时间 谁给钱多就给谁干 一居室好过养老年金险 房产保值升值 租金跑得赢通胀 一套刚需 一套改善 一套投资 三套
  • Win10系统下编译FFmpeg

    1 使用git下载源码 git clone git source ffmpeg org ffmpeg git ffmpeg 2 FFmpeg在windows平台编译需要使用MinGW w64来编译 单独使用MinGW w64比较麻烦 推荐使
  • pip镜像安装 python 安装库

    pip install openpyxl i https mirrors aliyun com pypi simple pip 本身更新 pip install upgrade pip vvv 上面是阿里云的 我用了特别快 语法 安装pip
  • 专利情况的基本了解

    专利 目标专利的拆解 提前关键词 构建检索式 适当的进行补充检 拆解已有技术的技术特征 申请书 说明书 权利要求 摘要 附图 优先权请求 发明 实用新型和外观设计 发明专利 实用新型专利和外观设计专利 发明专利 针对产品 方法或者产品 方法
  • c语言中两个有序数组合并,C语言算法:有序数组合并-2020-08-21

    方法 就是同时遍历两个数组 通过比大小 组成一个新数组 数组参数最好带上一个长度参数 防止越界 代码 合并数组 其中a b都是从小到大有序排列的数组 void mergeList int a int aLen int b int bLen
  • 高德地图api 地理编码(地址-->坐标)geocoder.getLocation在官方可以测试出结果,下载代码到本地却用不了 问题解决

    问题 高德地图api 地理编码 地址 gt 坐标 功能 通过输入 地址信息 得到 经纬度信息 geocoder getLocation在官方可以测试出结果 下载代码到本地却用不了 官方示例测试 可以从地址得到坐标 下载官方代码本地运行却出不
  • 最全的雅思8000词汇pdf_雅思听力场景分类词汇汇总,听力提分先搞定它!

    很多烤鸭来和哥聊天 聊听力的时候 大部分都会出现以下对话内容 为了让大家更加身临其境 我就做的趣味性点了哈 一 定 要 看 完 对 大家都是拿完资料就溜 一有问题就找哥谈心 不夸哥就算了 还不拿赞出来给哥 哼 抱住坚强的自己 擦干眼泪给你们
  • 2023 K8s 认证工程师 CKA 考题分析和题库练习(下)

    目录 10 考核知识 检查可用节点数量 题目内容 题目内容中文解释 做题解答 11 考核知识 一个 Pod 封装多个容器 题目内容 题目内容中文解释 官方文档搜索关键字 pod 编辑做题解答 12 考核知识 持久卷 PersistentVo
  • python列表+元组+字典+集合

    声明 本人的所有博客皆为个人笔记 作为个人知识索引使用 因此在叙述上存在逻辑不通顺 跨度大等问题 希望理解 分享出来仅供大家学习翻阅 若有错误希望指出 感谢 Python列表 序列中的每个元素都分配一个数字 它的位置 或索引 第一个索引是0
  • java设置多个数据源

    1 设置config properties文件 设置两个数据库连接 2 设置spring context xml文件 定义名为testDataSource和dataSource两个连接
  • LeetCode刷题顺序(新手入门)

    本刷题策略为leetcode官方的新手村策略 跟着主页官方的新手村策略刷题 按照每天刷三简单题或两中等题或一难题的速度刷题 每天预计花费1 5h 下面的顺序是探索卡中的顺序 数组 分为三部分 1 做好初始定义 2 运用基础算法思想 3 双索
  • 蛋白质组学数据的归一化/标准化处理

    1 前言 目的 调整由于技术 如处理 上样 预分 仪器等造成的样本间误差 这实际上是一种数据缩放的方法 一般在一个表达矩阵中 会涉及到多个样本 其表达量差异比较大 不能直接进行比较 比如某个样本表达量很大 在总体中就会占据绝对领导地位 这样
  • 邮件钓鱼的防守策略

    一 攻击背景 在历年的实战攻防演练中 人的漏洞是网络安全最大的脆弱点 而钓鱼攻击就是从内部攻破堡垒至关重要的手段 攻击者通过伪装成可信来源发送虚假邮件 诱导接收者点击恶意链接 提供敏感信息或执行恶意附件 从而获取机密信息或入侵系统 因此 在
  • MATLAB 之 基本概述

    文章目录 一 MATLAB 主要功能 1 数值计算功能 2 符号计算功能 3 绘图功能 4 程序设计语言功能 5 工具箱的扩展功能 二 MATLAB 操作界面 1 主窗口 2 命令行窗口 3 当前文件夹窗口 4 工作区窗口 5 搜索路径 三
  • [leetcode 周赛 149] 1154 一年中的第几天

    目录 1154 Day of the Year 一年中的第几天 描述 思路 代码实现 1154 Day of the Year 一年中的第几天 描述 给你一个按 YYYY MM DD 格式表示日期的字符串 date 请你计算并返回该日期是当
  • 【error】Lock wait timeout exceeded; try restarting transaction(mysql)事务锁

    目录 1 报错信息 2 解决方案 2 1 方案一 2 2 方案二 2 3 方案三 3 补充说明 3 1 三张表字段说明 原文链接 1 报错信息 背景 在做更新操作时 电脑重启了 重新运行mysql语句时报以下错误 报错信息 Lock wai
  • SQL中分组的一些用法group_concat

    分组查询 后面一篇文章我们将介绍MySQL的聚合函数 https blog csdn net qq 41453285 article details 88318318 group by通常与聚合函数放在一起使用 分组查询允许把数据分为多个逻
  • 高性能Mysql——分区表详解

    文章目录 分表和分区 分表和分区的区别 分表和分区联系呢 分区表分区方式 分区管理 分区表注意事项 分表和分区 分表 MySQL 的分表是真正的分表 一张表分成很多表后 每一个小表都是完整的一张表 都对应三个文件 一个 MYD数据文件 MY
  • html做群聊通讯方法,websocket学习和群聊实现

    WebSocket协议可以实现前后端全双工通信 从而取代浪费资源的长轮询 在此协议的基础上 可以实现前后端数据 多端数据 真正的实时响应 在学习WebSocket的过程中 实现了一个简化版群聊 过程和代码详细记录在这篇文章中 1 概述 1