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仿WebApi路由示例

    首先解释一下什么是NodeJS仿WebApi路由。 NodeJS仿WebApi路由 在传统的Web开发中,服务器需根据前端请求的URL路径来执行对应的处理逻辑,比如: https://www.example.com/user/login/ 这个请求会被服务器转发到对应的登录处理逻辑。 而在NodeJS中,可以通过自定义路由,来实现这种URL路径转发。 实现步…

    node js 2023年6月8日
    00
  • Node.js中.pfx后缀文件的处理方法

    Node.js中的.pfx后缀文件,通常是用于HTTPs通讯中,包含私钥和证书的一种格式。在Node.js中,我们可以使用crypto模块中的createSecureContext方法,来对.pfx文件进行处理。 1. 生成secureContext对象 secureContext对象包含了处理后的私钥和证书,可以用于HTTPS服务器的创建和使用。具体步骤如…

    node js 2023年6月8日
    00
  • 无编译/无服务器实现浏览器的CommonJS模块化

    实现浏览器的CommonJS模块化可以采用Browserify、webpack等工具进行打包编译。但是近年来出现了一些无编译、无服务器的方案,如使用ES modules、SystemJS、RequireJS、Browserify、Babel或使用CDN等。下面将详细介绍如何使用SystemJS实现浏览器的CommonJS模块化。 简介 SystemJS是一个…

    node js 2023年6月9日
    00
  • npm一键安装Python以及node-sass依赖环境的方法

    要在npm中一键安装Python和node-sass依赖环境,需要使用node-gyp这个工具。node-gyp是一个跨平台的工具,它可以编译Node.js模块中需要编译的原生C++代码。下面是具体的操作步骤: 1. 安装 Python 首先,需要安装Python。可以从官网下载最新版的Python。https://www.python.org/downlo…

    node js 2023年6月8日
    00
  • 详解nodejs 文本操作模块-fs模块(二)

    下面是详解nodejs 文本操作模块-fs模块(二)的完整攻略。 概述 在使用 Node.js 进行文件操作时,我们采用的是 fs 核心模块。fs 提供了一系列操作文件的方法,包括读写文件、创建文件、删除文件等等。在本篇攻略中,我们将重点探讨 fs 模块的文本操作方法。 读写文件 在 Node.js 中,文件的读写操作是非常常见的。以下示例演示了如何使用 f…

    node js 2023年6月8日
    00
  • nodejs命令行参数处理模块commander使用实例

    下面就是关于“nodejs命令行参数处理模块commander使用实例”的完整攻略: 一、背景介绍 在nodejs中,处理命令行参数是一个很常见的问题,而commander就是一个非常流行的命令行参数处理模块。它提供了一种方便的方式来解析命令行参数并生成帮助信息。 二、使用步骤 在使用commander模块时,需要按照以下步骤进行: 1. 安装command…

    node js 2023年6月8日
    00
  • 浅谈开发eslint规则

    下面是“浅谈开发eslint规则”的完整攻略,主要包括以下部分: 1. 简介 ESLint是一个用于检查JavaScript代码是否符合规范的工具,它提供了一系列的规则(Rules),可以帮助开发者统一代码风格、提高代码质量、减少代码缺陷等。但是,ESLint规则并不能覆盖所有的情况,有些特定的代码规范需要开发者自己开发,这就需要使用到自定义规则(Custo…

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

    当提及”node.js中的buffer.length方法”时,我们通常是指Buffer对象的length属性。它返回Buffer中存储的数据的字节长度。 使用方法很简单,只需要在一个Buffer实例上调用length属性即可获取该实例占用的字节长度。例如: const buf = Buffer.from(‘hello world’, ‘utf8’); con…

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