首页 > 编程语言 >聊天室(Websocket+Node)

聊天室(Websocket+Node)

时间:2024-10-11 18:21:47浏览次数:9  
标签:Node 聊天室 const socket console WebSocket client ws Websocket

文章目录


前言

使用Websocket+Node实现一个简单的聊天室的功能,以及包含保持websocket长时间连接永不断开的两种方法


一、Websocket是什么?

WebSocket是一种网络通信协议,是 HTML5 开始提供的一种在单个 TCP 连接上进行全双工通讯的协议。

WebSocket协议基于TCP协议实现,包含初始的握手过程,以及后续的多次数据帧双向传输过程。其目的是在WebSocket应用和WebSocket服务器进行频繁双向通信时,可以使服务器避免打开多个HTTP连接进行工作来节约资源,提高了工作效率和资源利用率。

二、使用步骤

1.服务端代码 

npm install koa
npm install ws
npm install koa-static
var Koa = require('koa');
const http = require('http');
const WebSocket = require('ws');
const path = require('path');
const serve = require('koa-static');

const app = new Koa(); // 初始化koa应用
app.use(serve(path.join(__dirname, '.'))); // 提供静态文件
const server = http.createServer(app.callback()); // 创建http服务器

let clientNames = ['小明', '小红', '小军', '小王']
const wss = new WebSocket.Server({ server }); // 创建 WebSocket 服务器

// 监听WebSocket连接
wss.on('connection', (ws) => {
  ws.clientName = clientNames.pop();
  console.log(ws.clientName + 'contect');
  
  // 监听客户端发送的消息
  ws.on('message', (message) => {
    wss.clients.forEach(client => {
      if(client.readyState !== WebSocket.OPEN) return
      
      if(message == 'hello') {
        client.send('收到,hello')
      }else {
        client.send(`${ws.clientName == client.clientName ? '我' : ws.clientName}:${message}`)
      }
    })
  })

  // 监听客户端断开连接
  ws.on('close', () => {
    console.log(`${ws.clientName} 断开连接!`);
  })
})

const PORT = 5500
server.listen(PORT, () => {
  console.log('5500端口连接上了---');
})

2.客户端代码

保持websocket长时间连接永不断开的两种方法

  • 方式一:定期发送心跳包

客户端代码

timeoutObj = setTimeout(() => {
        console.log('发送信息,重新连接----');
        socket.send('hello')
      }, 3000);

服务端代码

ws.on('message', (message) => {
    wss.clients.forEach(client => {
      if(client.readyState !== WebSocket.OPEN) return
      
      if(message == 'hello') {
        client.send('收到,hello')
      }else {
        client.send(`${ws.clientName == client.clientName ? '我' : ws.clientName}:${message}`)
      }
    })
  })
  • 方式二:捕获关闭连接事件并重连
socket.onclose = () => {
      console.log('断开连接!');
      // 方式一:
      setTimeout(() => {
        socket = new WebSocket(url);  // 重新连接
      }, 1000);  // 1秒后重连
    }
  • 完整代码
<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>Document</title>
</head>
<body>
  <h1>聊天室</h1>
  <ul id="messages"></ul>
  <input type="text" id="messageInput" autocomplete="off" />
  <button id="sendBtn">发送</button>

  <script>
    const url = 'ws://localhost:5500'
    const socket = new WebSocket(url)

    // 方式二:
    let timeoutObj = null;
    // 开启心跳
    const start = () => {
      clearTimeout(timeoutObj);
      // serverTimeoutObj && clearTimeout(serverTimeoutObj);
      timeoutObj = setTimeout(() => {
        console.log('发送信息,重新连接----');
        socket.send('hello')
      }, 3000);
    };
    const reset = () => {
      // 重置心跳 清除时间
      clearTimeout(timeoutObj);
      // 重启心跳
      start();
    };

    socket.onopen = () => {
      console.log('连接成功!')
      start(); // 开启心跳
    };
    socket.onclose = () => {
      console.log('断开连接!');
      // 方式一:
      // setTimeout(() => {
      //   socket = new WebSocket(url);  // 重新连接
      // }, 1000);  // 1秒后重连
    }
    socket.onerror = (err) => console.log('连接错误:'+err);

    // 当收到服务器消息时触发
    socket.onmessage = (e) => {
      const { data } = e
      if (data === '收到,hello') {
        reset();
        return;
      }else {
        const li = document.createElement('li')
        li.textContent = data
        document.getElementById('messages').appendChild(li)
      }
    }

    const sendBtn = document.getElementById('sendBtn')
    sendBtn.addEventListener('click', ()=> {
      const msgInput = document.getElementById('messageInput')
      const msg = msgInput.value;
      if(msg) {
        socket.send(msg)
        msgInput.value = ''
      }
    })
  </script>
</body>
</html>

3.成果展示

  • 页面不刷新

  • 页面刷新(心跳机制成果展示)

总结

以上就是今天要讲的内容,本文仅仅简单介绍了如何使用websocket实现一个简单聊天室的功能,欢迎各位大佬们多多指点。

标签:Node,聊天室,const,socket,console,WebSocket,client,ws,Websocket
From: https://blog.csdn.net/qq_44828539/article/details/142843990

相关文章

  • 65websocket服务端和客户端实现
     #server.pyimportasyncioimportwebsocketsasyncdefecho(websocket,path):asyncformessageinwebsocket:print(f"serverReceived:{message}")awaitwebsocket.send(f"Serverresponse:{message}")start_serve......
  • nodejs 和 npm 版本对应关系
    一、nodejs和npm的版本是有适配的首先看下官网列明的大概匹配关系:官网链接地址:https://nodejs.org/zh-cn/about/previous-releases可以查看下本地的版本,根据上表中的对应关系,看是否差别太大。如果差别太大需要更新到对应版本,不然会出现各种报错问题,导致npm命令执行失败。......
  • 教你如何免费获取股票数据用python、JavaScript (Node.js)、JAVA等多种语言的实例代码
    ​近一两年来,股票量化分析逐渐受到广泛关注。而作为这一领域的初学者,首先需要面对的挑战就是如何获取全面且准确的股票数据。因为无论是实时交易数据、历史交易记录、财务数据还是基本面信息,这些数据都是我们进行量化分析时不可或缺的宝贵资源。我们的核心任务是从这些数据......
  • Node.js 下载安装与环境配置
    下载Node.js,网址:https://nodejs.p2hp.com/登录node网址,点击下载安装2.双击node安装包,在弹出界面点击“Next”勾选同意,点击“Next”4.点击”Change“,修改安装目录,点击“Next”使用默认选项,点击下一步“Next”勾选自动安装工具,点击下一步“Next”7.点击......
  • 阿里云服务器ECS,CentOS Stream 9使用nrm管理 Node.js 包的下载源
    首先确保你的服务器上已经安装了Node.js。如果没安装,先安装...阿里云服务器ECS,CentOSStream9安装nodejs步骤_centos9nodejs-CSDN博客第一步:安装 nrm 工具用于管理npm源,终端输入:npmi-gnrm第二步:配置nrm查看当前使用的源,终端输入:nrmls切换下载源,例如淘宝,终端......
  • 运行使用Electron-forge打包的electron package时遇到在js文件中执行的exec命令和在渲
    js文件中执行的exec命令出错很可能是项目中使用了一些非html,css,js的源文件,比如用了Makefile来编译了cpp代码,或者执行的exec命令为cpdir/something.cpp之类的文件操作命令。可以使用修改forge.config.js文件配置的方式,使得npmrunmake的时候自动把Makefile等exec命令中用到......
  • 基于nodejs+vue疫情防控管理系统[开题+源码+程序+论文]计算机毕业设计
    本系统(程序+源码+数据库+调试部署+开发环境)带文档lw万字以上,文末可获取源码系统程序文件列表开题报告内容研究背景近年来,全球范围内频繁爆发的疫情给社会带来了前所未有的挑战,特别是在校园这一人员密集且流动性大的环境中,疫情防控工作显得尤为重要。随着信息技术的飞速发......
  • 基于nodejs+vue疫情防控管理系统[开题+源码+程序+论文]计算机毕业设计
    本系统(程序+源码+数据库+调试部署+开发环境)带文档lw万字以上,文末可获取源码系统程序文件列表开题报告内容研究背景在新冠疫情全球蔓延的背景下,校园作为人员密集、流动性大的特殊场所,疫情防控工作显得尤为重要。随着疫情形势的不断变化,传统的人工管理模式已难以满足高效、......
  • 基于nodejs+vue疫情防控管理系统[开题+源码+程序+论文]计算机毕业设计
    本系统(程序+源码+数据库+调试部署+开发环境)带文档lw万字以上,文末可获取源码系统程序文件列表开题报告内容研究背景近年来,全球范围内频繁爆发的疫情给社会生活和经济发展带来了巨大挑战。特别是在校园环境中,人员密集、流动性大,疫情防控难度尤为突出。为了确保师生的健康安......
  • 基于Node.js+vue高校宿舍分配管理系统(开题+程序+论文) 计算机毕业设计
    本系统(程序+源码+数据库+调试部署+开发环境)带文档lw万字以上,文末可获取源码系统程序文件列表开题报告内容研究背景随着高校招生规模的不断扩大,学生宿舍的管理变得日益复杂。传统的人工分配和管理方式不仅效率低下,而且容易出错,无法满足现代高校宿舍管理的需求。为了提升宿......