带你掌握webSocket 和 socket.io的基本用法

news/2024/4/24 3:40:40/文章来源:https://blog.csdn.net/qq_61233877/article/details/129277240

两者的作用和区别

作用:使得前后端可以随时地相互沟通。什么是互相沟通呢?像网络请求这种就是客户端向服务端的单向的沟通,当然,网络请求也可以实现双向的沟通,比如ajax 轮询,就是浏览器开个定时器不断的发送请求来了解后端数据库中数据是否变化,但是这个性能和方式好像不太好。
区别:看来自socket.io官网的一句话。
在这里插入图片描述简单理解就是,socket.io主要是基于webSocket实现的,然后做了一些封装和优化吧,嗯。下面直接用两个聊天的案例来带你掌握webSocket socketIo

webSocket的使用(html+nodeJs)

就我当前学到的,做聊天的话,webSocket主要做群聊吧,只要连接了就能接到消息。这个依赖于一个第三方包,所以需要先安装,yarn add ws,我安装的版本是8.12.1

服务端代码。这里采用nodeJS来编写一个webSocket服务,代码如下:

const websocket=require("ws")const server=new websocket.Server({port:6688},()=>{console.log('websocketServer is running in ws://localhost:6688');
})server.on("connection",(Ws)=>{  //用户连接时调用console.log('hello new user')Ws.on("message",(data)=>{//   console.log(data),可以看到传输过来的数据转buffer了let msgtry {const info=JSON.parse(data.toString())const words=info.msgconst name=info.namemsg=words&&name ?`${name}${words}`:"消息解析失败,请联系管理员!"} catch (err) {msg=data.toString()}server.clients.forEach((user)=>{  if(user.readyState===websocket.OPEN){    // websocket.OPEN值为1,表示用户已连接且可以正常通信user.send(msg)        // 把消息发送给连接本ws服务的代码端// user.timeout(500).send(msg)        // 500ms后发送}})// console.log(server.clients);})
})

编写完后,比如该文件名为 webSocketServer.js,我们就是在终端使用指令node webSocketServer启动该服务即可,这样客户端那边就能连接该服务了。

前端代码。api不多,可参考代码注释

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><meta http-equiv="X-UA-Compatible" content="IE=edge"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title></title><style>#allmsg{width: 300px;height: 250px;border: 1px solid black;overflow: auto;}#txtinput{width: 150px;height: 40px;}</style>
</head>
<body>
<h2>聊天社区</h2>
请输入当前登录用户的昵称:<input type="text" id="userName">
<p style="font-size:22px;">消息框</p>
<div id="allmsg"></div><br/><br/><br/>
<input type="text" name="" id="txtinput" placeholder="按回车发送消息"><script>
const ws=new WebSocket("ws://localhost:6688")
const txtinput=document.getElementById("txtinput")
const allmsg=document.getElementById("allmsg")
const userName=document.getElementById("userName")
let user=nulluserName.onblur=(e)=>{if(e.target.value)user={id:Math.random()+Date.now(),name:e.target.value}else user=null
}txtinput.onkeyup=(e)=>{if(e.keyCode===13)      // 通知socket切换房间{if(!user) {alert("请输入当前登录用户的昵称!");return}if(!txtinput.value) returnws.send(JSON.stringify({...user,msg:txtinput.value}))  // 向服务器发送消息 。ws.close() - 关闭连接txtinput.value=""}
}ws.onopen=()=>{       //自己连接服务器成功时回调ws.send("新用户加入聊天室")
}ws.onmessage=(msg)=>{  // 接到服务器的消息时回调allmsg.innerHTML+=`<p>${msg.data}</p>`
}
ws.onerror=(err)=>{     // 出错时回调console.log(err);
}
ws.onclose=()=>{       // 连接关闭时回调console.log('disconnection');
}
</script>
</body>
</html>

此时,我们就可以在该html页面open with live server3次或者更多来开多个页签,这样就可以开始测试聊天了。效果展示如下:

chat_webSocket

socket.io的使用(html+nodeJs)

由于socket.io丰富的api,可以用它来实现群聊或者私聊。这个依赖于两个第三方包,所以需要先安装
yarn add socket.io express,我安装的socket.io的版本是4.6.1

服务端代码。这里采用nodeJS来编写一个socketIO服务,代码如下,具体使用看注释

const server=require("http").createServer(require("express")())
const io=require("socket.io")(server,{cors:true})  //创建io并允许跨域io.on("connection",(socket)=>{  //有用户连接时回调
io.emit("msg","有新用户加入群聊室")
// io.local.emit("hello", "world");  //只向连接到当前服务器的客户端发送// 客户端 emit("msg")时回调
socket.on("msg",(data)=>{io.local.emit("msg",data)      // 把消息发送给所有订阅了msg的用户//socket.emit("msg",data)          // 把消息发送给订阅了msg的自己//socket.broadcast.emit("msg",data)   // 把消息发给除自己外的其他订阅了msg的所有用户
})// 利用房间发送私人消息
socket.on("privateChart",(room,data)=>{//socket.to("房间号").emit("msg",data)    // 把消息发送给已拥有房间中的指定房间内订阅了msg的除自己外的所有用户//socket.to("房间号1").to("房间号2").emit("msg",data)        // 也可以给多个房间发送socket.emit("privateChart",data)  socket.to(room).emit("privateChart",data);
})// 用来切换房间
socket.on("changeRoom",(room)=>{//console.log(room)if(room=="room1") {socket.join("room1")        // 添加指定房间socket.leave("room2")        // 删除指定房间}else{socket.join("room2")socket.leave("room1")}//console.log(socket.rooms)      // 拥有的房间列表
})socket.on("disconnect", (reason) => {// 此事件由 Socket 实例在断开连接时触发
});})server.listen(8866,()=>{
console.log('socketioServer is running in http://127.0.0.1:8866')
})

编写完后,比如该文件名为 socketIoServer.js,我们就是在终端使用指令node socketIoServer启动该服务即可,这样客户端那边就能连接该服务了。

前端代码如下,用到的api也不多,后端那边可能会多一点,具体使用看注释

<!DOCTYPE html>
<html lang="en"><head><meta charset="UTF-8" /><meta http-equiv="X-UA-Compatible" content="IE=edge" /><meta name="viewport" content="width=device-width, initial-scale=1.0" /><title></title><style>#groupMsg,#privateMsg {width: 300px;height: 250px;border: 1px solid black;overflow: auto;}#groupInput,#privateInput {width: 150px;height: 40px;}</style></head><body><h2>聊天社区</h2><h3>群聊房间</h3><div id="groupMsg"></div><br /><input type="text" name="groupInput" id="groupInput" placeholder="按回车发送群消息" /><h3>私聊房间</h3><div id="privateMsg"></div><br /><span>请选择您的聊天房间(相同房间的人才可聊天):</span><input type="radio" name="room" id="room1"  value="room1"  /> 房间1<input type="radio" name="room" id="room2"  value="room2" /> 房间2<br/><br/><br/><input type="text" name="privateInput" id="privateInput" placeholder="按回车发送私人消息" /><script src="/socket.io.js">// 该文件在服务端安装的 socket.io 包 的 client-dist 目录下,复制过来引入</script><script>//与服务器建立连接// const socket = io('http://localhost:8866/')const socket=io.connect("http://localhost:8866/")const groupInput = document.getElementById('groupInput')const groupMsg = document.getElementById('groupMsg')const privateInput = document.getElementById('privateInput')const privateMsg = document.getElementById('privateMsg')const room1 = document.getElementById('room1')const room2 = document.getElementById('room2')groupInput.onkeyup = (e) => {if (e.keyCode === 13) {if(!groupInput.value) returnsocket.emit('msg', groupInput.value)groupInput.value = ''}}privateInput.onkeyup = (e) => {if (e.keyCode === 13) {   // 按回车发送消息if(!room1.checked && !room2.checked) {alert("请选择私聊的房间");return}if(!privateInput.value) return// 发送私人消息,第二个参数与后端约定传递房间号,之后的参数就都是数据了socket.emit('privateChart', room1.checked?"room1":"room2", privateInput.value)//groupMsg.innerHTML+=`<p>${ groupInput.value}</p>`privateInput.value = ''}}room1.onchange=(e)=>{    // 通知socket切换房间socket.emit("changeRoom","room1")}room2.onchange=(e)=>{  // 通知socket切换房间socket.emit("changeRoom","room2")}socket.on('msg', (data) => {// 订阅服务器发送到'msg'处的消息groupMsg.innerHTML += `<p>${data}</p>`})socket.on('privateChart', (data) => {privateMsg.innerHTML += `<p>${data}</p>`})socket.on('connect', () => {  // 连接成功后回调})socket.on('disconnect', (reason) => {   // 连接断开时回调})</script></body>
</html>

此时,我们就可以在该html页面open with live server3次或者更多来开多个页签,这样就可以开始测试聊天了。然后要注意的是私人房间那里不要都选同一个房间。效果展示如下:

chat_socketIo

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

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

相关文章

【Java】Java进阶学习笔记(四)—— 抽象类与接口

【Java】Java进阶学习笔记&#xff08;四&#xff09;—— 抽象类与接口一、抽象类1、抽象类的概念抽象类的定义格式2、抽象类的注意点抽象方法的介绍3、抽象类的具体作用4、抽象类实例二、接口&#xff08;一&#xff09;、接口的概念1、接口与类的区别2、接口特性3、抽象类和…

如何实现云原生?推荐的几个实用工具

云原生是一种软件开发和部署的方法&#xff0c;它依赖于容器、微服务和自动化运维。它能使应用更高效、可靠和可扩展&#xff0c;并适用于不同的云平台。 如果要更直接、更通俗地解释上述概念的话。 云的本源更准确地说是一种文化&#xff0c;一种潮流&#xff0c;它必然是云…

此网站可能不支持TLS1.2协议

问题描述 火狐浏览器版本&#xff1a;“97.0.1 (64 位)”&#xff0c;打开360网神设备Web管理地址时出现&#xff1a;“此网站可能不支持TLS1.2协议&#xff0c;而这是Firefox支持的最低版本。”&#xff0c;如下图所示。 原本是默认使用https协议打开的&#xff0c;看起来出问…

蓝桥杯每日一题:不同路径数(dfs深度优先)

给定一个 nm的二维矩阵&#xff0c;其中的每个元素都是一个 [1,9] 之间的正整数。 从矩阵中的任意位置出发&#xff0c;每次可以沿上下左右四个方向前进一步&#xff0c;走过的位置可以重复走。 走了 k 次后&#xff0c;经过的元素会构成一个 (k1) 位数。 请求出一共可以走出…

零基础机器学习做游戏辅助第十五课--原神自动钓鱼(五)完整效果

一、先上效果二、整理思路我们现在已经具备了所有需要的技术&#xff0c;我们梳理出所有技术的流程。判断当前钓鱼状态&#xff08;未抛竿、已抛竿、上鱼中&#xff09;。未抛竿&#xff0c;截图并识别图中所有鱼类&#xff0c;选择其中一个种类。根据以选择鱼类选择对应鱼饵。…

从一个实例配置引入Prometheus的PromQL语法

1. PromQL介绍 PromQL提供对时间序列数据进行逻辑运算、过滤、聚合的支持。应用于数据查询、可视化、告警处理 2. 基本用法 2.1 查询时间序列 点击Prometheus图标,进行查询页面。可以点击地图图标查看有哪些metrics name。输入要查询的metrics name和过滤条件,然后点击执行…

2023年功能测试还值得入行吗?

前言 鉴于笔者从13年入行IT行业&#xff0c;经历了只有开发没有测试的阶段&#xff0c;经历了14年只要会基本的功能测试在一线就能薪资过万的阶段&#xff0c;经历了17年只要会一点自动化&#xff0c;会一点性能就能蒙骗过面试官的阶段&#xff0c;更经历了19年所有面试官对于…

基于大规模边缘计算的千万级聊天室技术实践

当前直播成为一种流行趋势&#xff0c;带货直播&#xff0c;网红带货&#xff0c;明星在线演唱会等&#xff0c;进一步使得直播聊天室变成了一个当前必备的能力&#xff0c;面向大型&#xff0c;超大型的直播场景&#xff0c;技术上也在不断的进行迭代更新。 大规模边缘聊天室如…

如何或者无插件Web页面监控播放软件LiveNVR的固定视频流地址,实现大屏上墙、播放、视频分析等目的

1、LiveNVR介绍 LiveNVR的安防监控的视频直播&#xff0c;可以按标准的Onvif/RTSP协议接入监控设备&#xff0c;也可以通过海康、大华、天地伟业等厂家私有SDK接入监控&#xff0c;实现web页面的播放和录像回放。 可以分发HTTP-FLV、WS-FLV、WebRTC、RTMP、HLS(M3U8)、RTSP等多…

全球化趋势下,如何建设稳定高效的技术能力?

如果将全球化比作一场航行&#xff0c;每个期望走出去的企业都是水手&#xff0c;那么是造一艘属于自己的船&#xff0c;还是搭乘已有的船呢&#xff1f;在不同的时间和场景下&#xff0c;相信每个水手都有自己的答案。 近几年&#xff0c;在国际政经环境复杂变幻的形势之下&am…

ImportError: Can not find the shared library: libhdfs3.so解决方案

大家好,我是爱编程的喵喵。双985硕士毕业,现担任全栈工程师一职,热衷于将数据思维应用到工作与生活中。从事机器学习以及相关的前后端开发工作。曾在阿里云、科大讯飞、CCF等比赛获得多次Top名次。喜欢通过博客创作的方式对所学的知识进行总结与归纳,不仅形成深入且独到的理…

活动回顾|中文社区面对面·上海站

回顾来了&#xff01; 「中文社区面对面」首次线下交流活动&#xff0c;于 2 月 26 日下午在上海德必世纪 WE 成功举办&#xff0c;迎来了 30 位上海小伙伴的热情参与&#xff01;Jina AI 高级算法工程师王峰博士与大家分享 Jina AI 的“三驾马车”&#xff0c;百万粉丝B站效率…

4.文件管理

文章目录1、初识文件管理1.1、回顾1.2、文件的属性1.3、无结构文件/有结构文件1.4、文件之间应该怎样组织起来&#xff1f;1.5、操作系统应该向上提供哪些功能&#xff1f;1.6、从上往下看&#xff0c;文件应如何存放在外存&#xff1f;1.7、其他需要由操作系统实现的文件管理功…

【蓝桥杯嵌入式】点亮LED灯,流水灯的原理图解析与代码实现——STM32

&#x1f38a;【蓝桥杯嵌入式】专题正在持续更新中&#xff0c;原理图解析✨&#xff0c;各模块分析✨以及历年真题讲解✨都在这儿哦&#xff0c;欢迎大家前往订阅本专题&#xff0c;获取更多详细信息哦&#x1f38f;&#x1f38f;&#x1f38f; &#x1fa94;本系列专栏 - 蓝…

实践数据湖iceberg 第四十二课(业界视野)业界的流批一体架构

系列文章目录 实践数据湖iceberg 第一课 入门 实践数据湖iceberg 第二课 iceberg基于hadoop的底层数据格式 实践数据湖iceberg 第三课 在sqlclient中&#xff0c;以sql方式从kafka读数据到iceberg 实践数据湖iceberg 第四课 在sqlclient中&#xff0c;以sql方式从kafka读数据到…

React(三):脚手架、组件化、生命周期、父子组件通信、插槽、Context

React&#xff08;三&#xff09;一、脚手架安装和创建1.安装脚手架2.创建脚手架3.看看脚手架目录4.运行脚手架二、脚手架下从0开始写代码三、组件化1.类组件2.函数组件四、React的生命周期1.认识生命周期2.图解生命周期&#xff08;1&#xff09;Constructor&#xff08;2&…

【封装xib补充 Objective-C语言】

一、那么首先,咱们就从这个结果来分析 1.就不给大家一步一步分析了,直接分析我们这里怎么想的, 首先,我们看到这样的一个界面,我们想,这些应用数据是不是来源于一个plist文件吧, 所以说,我们首先要,第一步,要懒加载,把这个plist文件中的数据,加载起来, 那么,因…

「JVM 高效并发」锁优化

为了线程间更高效的共享数据及解决竞争问题&#xff0c;提高程序执行效率&#xff0c;JDK 6 做了大量锁优化&#xff0c;如适应性自旋&#xff08;Adaptive Spinning&#xff09;、锁消除&#xff08;Lock Elimination&#xff09;、锁膨胀&#xff08;Lock Coarsening&#xf…

机器学习知识总结 —— 21. 什么是主成分分析

文章目录什么是PCA&#xff08;Principal Component Analysis&#xff09;协方差矩阵什么是协方差协方差矩阵特征值与特征向量PCA降维什么是PCA&#xff08;Principal Component Analysis&#xff09; 在机器学习中&#xff0c;PCA&#xff08;Principal Component Analysis&a…

实践数据湖iceberg 第四十一课 iceberg的实时性-业界的checkpoint配置

系列文章目录 实践数据湖iceberg 第一课 入门 实践数据湖iceberg 第二课 iceberg基于hadoop的底层数据格式 实践数据湖iceberg 第三课 在sqlclient中&#xff0c;以sql方式从kafka读数据到iceberg 实践数据湖iceberg 第四课 在sqlclient中&#xff0c;以sql方式从kafka读数据到…