nodejs 使用nodejs-websocket模块实现点对点实时通讯

使用nodejs-websocket模块实现点对点实时通讯

什么是nodejs-websocket模块

nodejs-websocket是一个用于node.js的WebSocket服务端实现的模块。它依赖Node.js内置的http模块,并支持与浏览器WebSocket协议兼容。

安装nodejs-websocket模块

在终端中执行以下命令进行安装:

npm install nodejs-websocket

创建WebSocket服务

在Node.js中创建WebSocket服务非常简单。我们只需要使用nodejs-websocket模块中的createServer函数,传入一个回调函数即可。

下面是一个简单的示例:

const ws = require('nodejs-websocket');

const server = ws.createServer(function(conn) {
    console.log('New connection');

    conn.on('text', function(str) {
        console.log('Received:', str);
        conn.sendText(str.toUpperCase());
    });

    conn.on('close', function(code, reason) {
        console.log('Connection closed');
    });
});

server.listen(8888);

这个示例中,我们创建了一个WebSocket服务,监听本地的8888端口。每当有一个WebSocket连接上来之后,就会执行回调函数,打印出一句话来表示新连接的到来,并注册了text事件和close事件的回调函数。

其中,text事件会在收到WebSocket客户端发送的文本消息时触发。在这个回调函数中,我们会将收到的文本消息转换为大写并且回发给客户端。close事件会在WebSocket客户端连接断开时触发。

使用WebSocket实现点对点实时通讯

在WebSocket中,我们可以通过conn.sendText方法向服务器发送文本消息,用conn.on方法监听来自服务器的消息。通过这个机制,我们就可以实现点对点的实时通讯。

下面是一个简单的示例:

客户端代码

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

ws.addEventListener('open', function() {
    console.log('Connected to server');

    ws.addEventListener('message', function(event) {
        console.log('Received:', event.data);
    });

    document.getElementById('btn-send').addEventListener('click', function() {
        const message = document.getElementById('input-message').value;
        ws.send(message);
    });
});

这个示例中,我们首先创建了一个WebSocket对象,指定了要连接的服务器地址。在open事件回调函数中,我们打印了一句话表示连接成功,并注册了message事件的回调函数。在回调函数中,我们打印出了来自服务器的文本消息。

另外,我们还在页面上添加了一个按钮和一个输入框,用于向服务器发送消息。在按钮的click事件回调函数中,我们通过WebSocket对象的send方法发送了用户在输入框中输入的消息。

服务器端代码

const ws = require('nodejs-websocket');

const server = ws.createServer(function(conn) {
    console.log('New connection');

    conn.on('text', function(str) {
        console.log('Received:', str);

        conn.other = null;
        server.connections.forEach(function(conn) {
            if (conn !== this) {
                this.other = conn;
            }
        }, conn);

        if (this.other) {
            this.other.sendText(str);
        }
    });
});

server.listen(8888);

这个示例中,我们在服务器端改写了text事件的回调函数。在这个回调函数中,我们首先遍历所有的WebSocket连接,查找除当前连接之外的其它连接。如果找到了其它连接,就将当前连接和其它连接关联起来。当我们收到来自某个连接的消息时,就将这条消息发送给关联的其它连接。

实现简单的聊天室

通过使用WebSocket实现点对点实时通讯,我们可以轻松地实现一个简单的聊天室。下面是一个简单的示例:

客户端代码

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

ws.addEventListener('open', function() {
    console.log('Connected to server');

    ws.addEventListener('message', function(event) {
        const message = JSON.parse(event.data);

        const li = document.createElement('li');
        li.textContent = message.username + ': ' + message.text;
        document.getElementById('chat').appendChild(li);
    });

    document.getElementById('btn-send').addEventListener('click', function() {
        const message = {
            username: document.getElementById('input-username').value,
            text: document.getElementById('input-message').value
        };
        ws.send(JSON.stringify(message));
    });
});

这个示例中,我们在向服务器发送消息时,JSON序列化了一个包含用户名和消息内容的对象,并在接收到来自服务器的消息时,将其解析为一个包含用户名和消息内容的对象,并将其显示在聊天内容列表中。

服务器端代码

const ws = require('nodejs-websocket');

const server = ws.createServer(function(conn) {
    console.log('New connection');

    const username = 'User' + Math.floor(Math.random() * 1000);

    conn.on('text', function(str) {
        console.log('Received:', str);

        const message = JSON.parse(str);

        server.connections.forEach(function(other) {
            other.sendText(JSON.stringify({
                username: username,
                text: message.text
            }));
        });
    });

    conn.on('close', function(code, reason) {
        console.log('Connection closed');
        server.connections.forEach(function(other) {
            other.sendText(JSON.stringify({
                username: username,
                text: 'has left the chat room'
            }));
        });
    });

    server.connections.forEach(function(other) {
        other.sendText(JSON.stringify({
            username: username,
            text: 'has entered the chat room'
        }));
    });
});

server.listen(8888);

这个示例中,我们在服务器端改写了text事件和close事件的回调函数。在text事件的回调函数中,我们遍历所有的WebSocket连接,将来自当前连接的消息发送给其它连接。在close事件的回调函数中,我们同样遍历所有的WebSocket连接,将连接关闭的消息发送给其它连接。

除此之外,我们还为每个连接生成了一个随机的用户名,并在连接建立和关闭时分别发送了进入聊天室和离开聊天室的消息。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:nodejs 使用nodejs-websocket模块实现点对点实时通讯 - Python技术站

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

相关文章

  • NodeJs模拟登陆正方教务

    下面是“NodeJs模拟登陆正方教务”的完整攻略: 一、前置准备 在开始NodeJs模拟登陆正方教务之前,我们需要保证以下几点: 学校教务系统平台支持模拟登陆,常见的支持教务系统有“正方教务系统”、“智慧校园”等; 获取学校教务系统的账号和密码,以进行模拟登陆; 安装NodeJs开发环境和npm包管理工具,以便安装相关插件。 二、安装必要插件 模拟登陆正方教…

    node js 2023年6月8日
    00
  • JS前端开发模拟虚拟dom转真实dom详解

    下面是“JS前端开发模拟虚拟DOM转真实DOM详解”的完整攻略。 什么是虚拟DOM 虚拟DOM(Virtual DOM)是由React.js提出的一种机制,通过在JS对象中模拟DOM节点的状态信息,实现了高效的DOM操作,从而优化了前端的性能。虚拟DOM一般都是采用JavaScript对象来描述一棵树形结构,每个节点表示一个组件或元素,其中包含了当前节点所需…

    node js 2023年6月8日
    00
  • node.js中的fs.unlink方法使用说明

    当我们需要删除一个文件时,我们可以使用Node.js中的fs.unlink()方法。该方法可以从文件系统中删除指定的文件。 fs.unlink()方法的使用说明 语法: fs.unlink(path, (err) => { if (err) throw err; console.log(‘文件已成功删除’); }); 参数说明: path:一个字符串,…

    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
  • 详解node登录接口之密码错误限制次数(含代码)

    下面是对题目所提到的完整攻略的详细讲解。 标题:详解node登录接口之密码错误限制次数(含代码) 概述 密码错误限制次数是在用户登录时,为了防止恶意攻击和密码猜测,而限制用户输入错误密码的次数,达到一定的次数后,将会给用户一个提示,要么等待一段时间后继续登录,要么通过其他方式找回密码。本攻略将详细讲解如何在Node.js中实现密码错误次数限制功能。 实现思路…

    node js 2023年6月8日
    00
  • Node.js API详解之 timer模块用法实例分析

    Node.js API详解之 timer模块用法实例分析 在Node.js中,timer模块提供了定时器相关的API,用于实现各种与时间相关的功能。本文将对timer模块的用法进行详细分析。 setTimeout(callback, delay[, …args]) setTimeout函数用于在指定的时间后执行一次回调函数。其用法如下: setTimeo…

    node js 2023年6月8日
    00
  • 详解Vue2的diff算法

    详解Vue2的diff算法 什么是diff算法? diff算法是指在比较两个树形结构之间的不同之处时使用的一种算法。在Vue的虚拟DOM中,使用diff算法来计算出虚拟DOM的差异,然后再根据差异进行最小化的更新。 Vue2中的diff算法 Vue2中的diff算法采用了双端比较的策略。双端比较会同时在新旧虚拟DOM中分别开启头尾两个指针,在头尾两端同时向中…

    node js 2023年6月8日
    00
  • js 获取(接收)地址栏参数值的方法

    获取地址栏参数值是前端开发中常见的操作,JavaScript 提供了多种方法实现这个功能。下面是两种比较常用的方法: 方法一:使用 URLSearchParams URLSearchParams 是一个 Web API,可以方便地操纵 URL 的查询参数。在大部分浏览器上都有支持。 首先,我们可以通过 location.search 获取 URL 查询参数。…

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