当前位置: 首页 > news >正文

猿创征文|前端进阶必备——WebSockt实现聊天室(附源码)

WebSockt 实现聊天室

    • 1. websocket 是什么?
    • 2. 作用场景
    • 3. 传统http实现推送技术的弊端
    • 4. WebSockt 常用API
    • 5. WebSocket实现聊天室

在这里插入图片描述

1. websocket 是什么?

  • WebSocket使得客户端和服务器之间的数据交换变得更加简单,允许服务端主动向客户端推送数据
  • 在WebSocket API中,浏览器和服务器只需要完成一次握手,两者之间就直接可以创建持久性的连接,并进行双向数据传输。

2. 作用场景

  • 即时通讯(各种聊天软件)
  • 多玩家在线游戏(数据需要同步刷新)
  • 协同编辑/编程
  • 股票基金报价
  • 体育实况、新闻更新

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

在这里插入图片描述

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

  • 传统的技术一般使用 http + 定时器的方式(轮询)去实现
  • 很多网站为了实现推送技术,所用的技术都是轮询。轮询是在特定的的时间间隔(如每1秒),由浏览器对服务器发出HTTP请求,然后由服务器返回最新的数据给客户端的浏览器。
  • 这种传统的模式带来很明显的缺点,即:浏览器需要不断的向服务器发出请求,然而HTTP请求可能包含较长的头部,其中真正有效的数据可能只是很小的一部分,显然这样会浪费很多的带宽等资源
  • 而比较新的技术去做轮询的效果是Comet。
  • 这种技术虽然可以双向通信,但依然需要反复发出请求。而且在Comet中,普遍采用的长链接,也会消耗服务器资源。
    在这里插入图片描述

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. 项目结构

在这里插入图片描述

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()
})

1. 希望本文能对大家有所帮助,如有错误,敬请指出

2. 原创不易,还请各位客官动动发财的小手支持一波(关注、评论、点赞、收藏)
3. 拜谢各位!后续将继续奉献优质好文
4. 如果存在疑问,可以私信我(主页有Q)

在这里插入图片描述

相关文章:

  • 计算机大一新生,想卷却找不到方向,恳请前辈指指路?
  • Spring-02 IOC与DI
  • EasyExcel知识【Java程序进行读写生成Excel操作】
  • HALCON边缘检测
  • ATC‘22顶会论文RunD:高密高并发的轻量级 Serverless 安全容器运行时 | 龙蜥技术
  • 一篇经典的 Redis 面试资料「处女座笔记」「吐血推荐」...
  • 李沐d2l(十一)--目标检测
  • 美国上周初请人数23.2万人是两个月最低水平 美联储加息75基点稳了
  • 【技术美术知识储备】图形渲染管线1.0-基本概念CPU负责的应用阶段
  • 教你如何使用关键词获取淘宝和天猫的商品信息
  • lodash笔记(语言篇)
  • elasticsearch 6.3.2 集群配置
  • 操作系统复习:线程
  • Web3社交基础设施SBT
  • SAP-ABAP-SELECT语法SQL语法详解
  • “寒冬”下的金三银四跳槽季来了,帮你客观分析一下局面
  • 03Go 类型总结
  • 2019.2.20 c++ 知识梳理
  • CSS 三角实现
  • C语言笔记(第一章:C语言编程)
  • GDB 调试 Mysql 实战(三)优先队列排序算法中的行记录长度统计是怎么来的(上)...
  • Go 语言编译器的 //go: 详解
  • HTML-表单
  • IE报vuex requires a Promise polyfill in this browser问题解决
  • JAVA并发编程--1.基础概念
  • Java读取Properties文件的六种方法
  • Making An Indicator With Pure CSS
  • Protobuf3语言指南
  • Stream流与Lambda表达式(三) 静态工厂类Collectors
  • VirtualBox 安装过程中出现 Running VMs found 错误的解决过程
  • 阿里云ubuntu14.04 Nginx反向代理Nodejs
  • 容器化应用: 在阿里云搭建多节点 Openshift 集群
  • 深入浏览器事件循环的本质
  • 使用Envoy 作Sidecar Proxy的微服务模式-4.Prometheus的指标收集
  • 新版博客前端前瞻
  • 用 vue 组件自定义 v-model, 实现一个 Tab 组件。
  • 最近的计划
  • 翻译 | The Principles of OOD 面向对象设计原则
  • #QT(串口助手-界面)
  • (23)Linux的软硬连接
  • (3)(3.5) 遥测无线电区域条例
  • (Bean工厂的后处理器入门)学习Spring的第七天
  • (仿QQ聊天消息列表加载)wp7 listbox 列表项逐一加载的一种实现方式,以及加入渐显动画...
  • (附源码)springboot“微印象”在线打印预约系统 毕业设计 061642
  • (太强大了) - Linux 性能监控、测试、优化工具
  • (转)C语言家族扩展收藏 (转)C语言家族扩展
  • (转)Google的Objective-C编码规范
  • (转)http协议
  • .L0CK3D来袭:如何保护您的数据免受致命攻击
  • .locked1、locked勒索病毒解密方法|勒索病毒解决|勒索病毒恢复|数据库修复
  • .NET C#版本和.NET版本以及VS版本的对应关系
  • .NET国产化改造探索(一)、VMware安装银河麒麟
  • @Mapper作用
  • @在php中起什么作用?
  • [3300万人的聊天室] 作为产品的上游公司该如何?