Nodejs + Websocket 指定发送及群聊的实现

yizhihongxing

下面是针对“Nodejs + WebSocket 指定发送及群聊的实现”的完整攻略:

1. 基本概念

什么是 WebSocket?

WebSocket 是一种 HTML5 中的新技术,它允许客户端和服务器之间建立一个双向的、基于浏览器的实时通信通道。通俗地说,WebSocket 就是可以在浏览器和服务器之间实现双向通信的技术。

什么是 Node.js?

Node.js 是一种基于 Chrome V8 引擎的 JavaScript 运行环境。具有事件驱动、非阻塞 I/O 和轻量级的特点,可用于构建各种 Web 应用程序及实时的网络应用程序。

2. 实现过程

步骤一:搭建 WebSocket 服务器

需要使用 ws 包,它提供了 WebSocket 协议的实现。在 package.json 中添加如下依赖:

"dependencies": {
    "ws": "^7.4.3"
}

接着在 Node.js 中创建 WebSocket 服务器的代码如下:

const WebSocket = require('ws');

const wss = new WebSocket.Server({ port: 3000 });

步骤二:连接 WebSocket 服务器

在前端界面中,使用 JavaScript 建立 WebSocket 连接的代码如下:

const socket = new WebSocket('ws://localhost:3000');

步骤三:发送和接收消息

发送和接收消息的代码如下:

// 发送消息
socket.send(message);

// 接收消息
socket.onmessage = function(event) {
    console.log(event.data);
};

需要注意的是,在发送消息时,可以使用 socket.send() 方法来发送消息,接收消息时需要使用 socket.onmessage 方法。

步骤四:指定发送消息

在 WebSocket 中,可以实现指定发送消息的功能,即将消息发送给指定的客户端。实现方法如下:

// 获取所有 WebSocket 连接
const sockets = Array.from(wss.clients);

// 发送消息给所有 WebSocket 连接
sockets.forEach(socket => {
    socket.send(message);
});

// 发送消息给指定 WebSocket 连接
const socket = sockets.find(socket => condition);
socket.send(message);

在上面的代码中,首先将所有的 WebSocket 连接放在一个数组中,然后可以通过循环的方式将消息发送给所有的客户端。如果只需要向指定的客户端发送消息,则需要通过筛选条件找到指定的客户端。

步骤五:群聊功能

在 WebSocket 中,可以实现群聊的功能,即多个人都可以参与到同一个聊天室中,并实时收到其他人的消息。实现方法如下:

// 创建聊天室数组
const chatroom = [];

// 添加用户到聊天室
chatroom.push(socket);

// 将消息发送给聊天室中所有用户
chatroom.forEach(socket => {
    socket.send(message);
});

在上面的代码中,首先创建一个数组来存储所有参与聊天室的用户,然后将新用户添加到数组中。当有用户发送消息时,将消息发送给聊天室中所有的用户。

3. 示例说明

示例一:实现一个简单的群聊功能

// 创建 WebSocket 服务器
const WebSocket = require('ws');
const wss = new WebSocket.Server({ port: 3000 });

// 创建聊天室数组
const chatroom = [];

// 监听连接事件
wss.on('connection', function(socket) {
    // 添加用户到聊天室
    chatroom.push(socket);

    // 监听消息事件
    socket.on('message', function(message) {
        // 将消息发送给聊天室中所有用户
        chatroom.forEach(client => {
            if(client.readyState === WebSocket.OPEN) {
                client.send(message);
            }
        });
    });

    // 监听关闭事件
    socket.on('close', function() {
        // 从聊天室数组中删除用户
        chatroom.splice(chatroom.indexOf(socket), 1);
    });
});

在上面的代码中,我们创建了一个 WebSocket 服务器,并监听 connection 事件。当有用户连接到服务器时,我们将其添加到聊天室数组中。接着,我们监听 socket 的消息事件,并将消息发送给聊天室中的所有用户。

示例二:实现指定发送和群聊功能

// 创建 WebSocket 服务器
const WebSocket = require('ws');
const wss = new WebSocket.Server({ port: 3000 });

// 创建聊天室数组
const chatroom = [];

// 监听连接事件
wss.on('connection', function(socket) {
    // 添加用户到聊天室
    chatroom.push(socket);

    // 监听消息事件
    socket.on('message', function(message) {
        // 处理指令
        if(message.startsWith('/to ')) { // 指定发送
            const userId = message.substring(4);
            const targetSocket = chatroom.find(client => client.userId === userId);
            if(targetSocket) {
                targetSocket.send(message.substring(userId.length + 5));
            }
        } else { // 群聊
            // 将消息发送给聊天室中所有用户
            chatroom.forEach(client => {
                if(client.readyState === WebSocket.OPEN) {
                    client.send(message);
                }
            });
        }
    });

    // 监听关闭事件
    socket.on('close', function() {
        // 从聊天室数组中删除用户
        chatroom.splice(chatroom.indexOf(socket), 1);
    });
});

在上面的代码中,我们对之前的代码进行了修改,实现了指定发送和群聊功能。对于指定发送,我们通过解析消息内容,找到目标用户的 WebSocket 连接,并将消息发送给目标用户。对于群聊,则是将消息发送给聊天室中的所有用户。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Nodejs + Websocket 指定发送及群聊的实现 - Python技术站

(0)
上一篇 2023年6月8日
下一篇 2023年6月8日

相关文章

  • 防止Node.js中错误导致进程阻塞的办法

    当使用Node.js开发Web应用或服务器时,难免会遇到各种错误导致进程阻塞的情况,例如同步I/O、死循环、大量计算等。为了避免这些问题,以下是几种防止Node.js中错误导致进程阻塞的办法: 1. 使用异步操作 Node.js运行在单线程上,如果使用同步I/O操作,会导致进程阻塞。因此,可以使用异步操作,例如使用setTimeout()或setInterv…

    node js 2023年6月8日
    00
  • Node.js的环境安装配置(使用nvm方式)

    Node.js是一门基于JavaScript的非阻塞I/O的编程语言,可应用于服务器端的JavaScript开发,有着高效、轻量、易用等特点,是如今最流行的后端开发技术之一。这里介绍Node.js的环境安装配置,使用nvm的方式进行安装,方便在多个版本之间进行切换。 安装nvm nvm是Node.js的版本管理工具,它可以帮助我们在不同版本之间切换,并且可以…

    node js 2023年6月8日
    00
  • Three.js实现3D乒乓球小游戏(物理效果)

    Three.js实现3D乒乓球小游戏(物理效果)攻略 简介 Three.js是一个轻量级的JavaScript库,它能够在网页上创建和渲染3D图形。这篇攻略将讲解如何使用Three.js实现3D乒乓球小游戏,并对其中的物理效果进行详细剖析。 准备工作 在开始之前,你需要准备以下工具和环境: 浏览器:推荐使用Chrome或Firefox浏览器; 代码编辑器:推…

    node js 2023年6月8日
    00
  • 微信js-sdk上传与下载图片接口用法示例

    好的。首先,需要明确一下微信js-sdk是指微信公众号提供的一套前端JS接口,可以让网页嵌入到微信客户端内部,从而实现与微信相关的功能接口调用。微信js-sdk中提供了图片上传和下载的接口,下面分别对两个功能进行详细讲解。 图片上传接口用法示例 步骤1:引入微信JS-SDK 在需要使用图片上传接口的页面中,需要先引入微信JS-SDK的相关代码,在<he…

    node js 2023年6月8日
    00
  • Node.js与PHP、Python的字符处理性能对比

    一、概述 Node.js、PHP和Python都是非常流行的服务器端编程语言,它们都拥有各自的优势和适用场景。其中,字符处理是每个编程语言的重要组成部分,因此在这篇文章中,我们将比较一下Node.js、PHP和Python的字符处理性能。 二、测试环境 我们使用了一台配置相同的机器进行测试,具体配置如下: 操作系统: Ubuntu 20.04 LTS CPU…

    node js 2023年6月8日
    00
  • nodejs简单读写excel内容的方法示例

    当我们需要读取和写入excel文件时,可以使用Node.js的相关模块来实现。下面是一个基本的攻略,可以帮助你快速入门。 环境准备 在开始使用Node.js来读写excel内容之前,你需要安装对应的模块。可以使用npm安装xlsx模块。 npm install xlsx 在安装完相关模块后,我们便可以开始读写excel文件了。 读取excel文件 下面是读取…

    node js 2023年6月8日
    00
  • 解读node.js中的path路径模块

    节点(Node.js)的path模块提供了一些有用的函数来管理文件路径。 在本攻略中,我们将讨论这个模块的一些常用函数,以及如何使用它们解析文件路径。 获取文件名 使用path模块可以方便地解析文件名,例如,path.basename()函数可以从文件路径中提取文件名。 const path = require(‘path’); console.log(pa…

    node js 2023年6月8日
    00
  • jquery下jstree简单应用 – v1.0

    下面是jQuery下jstree简单应用的完整攻略: 一、jstree是什么? jstree是一个非常优秀、强大的jQuery插件,可以用来创建树形图结构。它支持多种数据源(包括 JSON 和 XML),提供了丰富的配置和事件处理机制,可以灵活、方便的展现数据结构。 二、如何使用jstree? 1. 引入js和css资源文件 <link rel=&qu…

    node js 2023年6月8日
    00
合作推广
合作推广
分享本页
返回顶部