前端进阶必备——WebSockt实现聊天室(附源码)

简介: 笔记

1. websocket 是什么?


WebSocket使得客户端和服务器之间的数据交换变得更加简单,允许服务端主动向客户端推送数据。

在WebSocket API中,浏览器和服务器只需要完成一次握手,两者之间就直接可以创建持久性的连接,并进行双向数据传输。


2. 作用场景

即时通讯(各种聊天软件)

多玩家在线游戏(数据需要同步刷新)

协同编辑/编程

股票基金报价

体育实况、新闻更新

通常来说,对数据敏感度高、需要及时更新数据的产品基本都会用到 websocket


image.png



3. 传统http实现推送技术的弊端



传统的技术一般使用 http + 定时器的方式(轮询)去实现

很多网站为了实现推送技术,所用的技术都是轮询。轮询是在特定的的时间间隔(如每1秒),由浏览器对服务器发出HTTP请求,然后由服务器返回最新的数据给客户端的浏览器。

这种传统的模式带来很明显的缺点,即:浏览器需要不断的向服务器发出请求,然而HTTP请求可能包含较长的头部,其中真正有效的数据可能只是很小的一部分,显然这样会浪费很多的带宽等资源。

而比较新的技术去做轮询的效果是Comet。

这种技术虽然可以双向通信,但依然需要反复发出请求。而且在Comet中,普遍采用的长链接,也会消耗服务器资源

12.png


4. WebSockt 常用API


  • 实例化websocket的对象
 const ws = new WebSocket('ws://127.0.0.1:8080')
  • 监听连接状态
ws.onopen = function () {
    console.log('ws连接状态:' + ws.readyState);
    // 成功则发送一个数据
    ws.send('111');
 }
  • 接收消息
ws.onmessage = function(data){
     // data.data 就是接收到的数据
 }
  • 发送消息
ws.send(data) // data必须是字符串
  • 监听连接关闭事件
ws.onclose = function () {
    console.log('ws连接状态:' + ws.readyState);
}
  • 监听错误
ws.onerror = function (error) {
    console.log(error);
}


5. WebSocket实现聊天室


1. 项目结构

13.png

2.app.js 代码

let WebSocketServer = require('ws').Server;
wss = new WebSocketServer({ip: '0.0.0.0', port: 8080 });
let wsolist = []
console.log('启动服务器:ws://127.0.0.1:8080');
wss.on('connection', function (ws, req) {
    wsolist.push(ws)
    console.log('和客服端' + req.connection.remoteAddress
     + '建立了一个连接,是连接的第'+ (wsolist.length +1) +'个用户');
    ws.on('message', function (message) {
        console.log(message.toString());
        wsolist.forEach((wso) => {
            wso.send(message.toString())
        })
    });
    ws.on('close', function close() {
        wsolist = wsolist.filter(obj => obj !== ws)
    });
});

3. index.html

<!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>Document</title>
    <style>
        .container{
            margin: 10px 0;
            border: 1px solid pink;
        }
    </style>
</head>
<body>
    <h1>websocket聊天室</h1>
    <div>
        <input type="text" placeholder="请输入消息内容" id="msg">
        <button id="sendBtn">发送</button>  
        <button id="closeBtn">关闭ws聊天室</button>
    </div>
    <div class="container">
    </div>
</body>
</html>

4. js 代码

// 1. 获取元素
let msg = document.querySelector('#msg')
let send_btn = document.querySelector('#sendBtn')
let close_btn = document.querySelector('#closeBtn')
let container = document.querySelector('.container')
// 2. 建立ws连接
let ws = new WebSocket('ws://192.168.29.54:8080')
// 3. 实现消息的发送
send_btn.addEventListener('click', function(){
    ws.send(msg.value)
    msg.value = ''
})
// 4. 实现消息的接收
ws.onmessage = function(data){
    console.log(data.data);
    container.innerHTML +=  ` <div>${data.data}</div>`
}
// 5. 关闭ws连接
close_btn.addEventListener('click', function(){
    ws.close()
})


目录
相关文章
|
2天前
|
机器学习/深度学习 前端开发 算法
婚恋交友系统平台 相亲交友平台系统 婚恋交友系统APP 婚恋系统源码 婚恋交友平台开发流程 婚恋交友系统架构设计 婚恋交友系统前端/后端开发 婚恋交友系统匹配推荐算法优化
婚恋交友系统平台通过线上互动帮助单身男女找到合适伴侣,提供用户注册、个人资料填写、匹配推荐、实时聊天、社区互动等功能。开发流程包括需求分析、技术选型、系统架构设计、功能实现、测试优化和上线运维。匹配推荐算法优化是核心,通过用户行为数据分析和机器学习提高匹配准确性。
21 3
|
2月前
|
JSON 前端开发 Java
震惊!图文并茂——Java后端如何响应不同格式的数据给前端(带源码)
文章介绍了Java后端如何使用Spring Boot框架响应不同格式的数据给前端,包括返回静态页面、数据、HTML代码片段、JSON对象、设置状态码和响应的Header。
161 1
震惊!图文并茂——Java后端如何响应不同格式的数据给前端(带源码)
|
2月前
|
存储 前端开发 Java
验证码案例 —— Kaptcha 插件介绍 后端生成验证码,前端展示并进行session验证(带完整前后端源码)
本文介绍了使用Kaptcha插件在SpringBoot项目中实现验证码的生成和验证,包括后端生成验证码、前端展示以及通过session进行验证码校验的完整前后端代码和配置过程。
258 0
验证码案例 —— Kaptcha 插件介绍 后端生成验证码,前端展示并进行session验证(带完整前后端源码)
|
2月前
|
JSON 前端开发 数据格式
@RequestMapping运用举例(有源码) 前后端如何传递参数?后端如何接收前端传过来的参数,传递单个参数,多个参数,对象,数组/集合(有源码)
文章详细讲解了在SpringMVC中如何使用`@RequestMapping`进行路由映射,并介绍了前后端参数传递的多种方式,包括传递单个参数、多个参数、对象、数组、集合以及JSON数据,并且涵盖了参数重命名和从URL中获取参数的方法。
195 0
@RequestMapping运用举例(有源码) 前后端如何传递参数?后端如何接收前端传过来的参数,传递单个参数,多个参数,对象,数组/集合(有源码)
|
2月前
|
前端开发 JavaScript 小程序
前端uni开发后端用PHP的圈子系统该 如何做源码?
圈子系统系统基于TP6+Uni-app框架开发;客户移动端采用uni-app开发,管理后台TH6开发。系统支持微信公众号端、微信小程序端、H5端、PC端多端账号同步,可快速打包生成APP
|
4月前
|
前端开发 JavaScript 应用服务中间件
【uniapp】谷歌授权登录,前端uniapp直调(含源码)
本文介绍如何在uniapp项目中实现谷歌授权登录,无需后端参与。文章分为三部分:1)谷歌授权登录流程,详细说明从用户点击登录到获取用户信息的整个过程;2)谷歌开发者控制台配置,包括创建项目、配置同意屏幕及OAuth客户端ID等步骤;3)uniapp前端实操,提供具体代码示例,展示如何获取授权码并用其交换访问令牌,最终获取用户信息
181 2
【uniapp】谷歌授权登录,前端uniapp直调(含源码)
|
3月前
|
机器学习/深度学习 数据采集 JavaScript
ADR智能监测系统源码,系统采用Java开发,基于SpringBoot框架,前端使用Vue,可自动预警药品不良反应
ADR药品不良反应监测系统是一款智能化工具,用于监测和分析药品不良反应。该系统通过收集和分析病历、处方及实验室数据,快速识别潜在不良反应,提升用药安全性。系统采用Java开发,基于SpringBoot框架,前端使用Vue,具备数据采集、清洗、分析等功能模块,并能生成监测报告辅助医务人员决策。通过集成多种数据源并运用机器学习算法,系统可自动预警药品不良反应,有效减少药害事故,保障公众健康。
ADR智能监测系统源码,系统采用Java开发,基于SpringBoot框架,前端使用Vue,可自动预警药品不良反应
|
4月前
|
前端开发
【前端】校园二手书交易系统javascript+css+html (源码)【独一无二】
【前端】校园二手书交易系统javascript+css+html (源码)【独一无二】
|
5月前
|
JavaScript 前端开发 NoSQL
前端node如何学习进阶知识
【7月更文挑战第8天】 深化JavaScript基础,精通Node.js核心模块(如fs、http)与事件循环机制,学习Express框架及异步编程(回调、Promise、async/await),掌握数据库交互,参与实战项目,关注Node.js最新技术和最佳实践,以此提升进阶技能。
54 8
|
4月前
|
监控 数据可视化 前端开发
【前端】政务服务大数据可视化监控平台(源码+html+css+js)
【前端】政务服务大数据可视化监控平台(源码+html+css+js)