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

yizhihongxing

使用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日

相关文章

  • Node.js使用Koa搭建 基础项目

    下面我会详细讲解“Node.js使用Koa搭建基础项目”的完整攻略。 1. 安装Node.js和npm 如果您还没有安装Node.js和npm,可以前往官网 https://nodejs.org/ ,选择适合您操作系统的版本进行下载和安装。 2. 初始化项目 在命令行中使用以下命令来创建一个新的项目,例如名为“koa-demo”: $ mkdir koa-d…

    node js 2023年6月8日
    00
  • Node.js 服务器端应用开发框架 — Hapi.js

    Hapi.js 是一个 Node.js 服务器端应用开发框架,它基于 Node.js 的 HTTP 实现,并且提供了一系列的工具,使得开发者可以轻松地构建 Web 应用,API 服务等。以下是使用 Hapi.js 框架开发应用的完整攻略。 安装 在使用 Hapi.js 框架之前,我们需要先安装 Node.js,然后使用 Node.js 的包管理器 npm 进…

    node js 2023年6月8日
    00
  • 浅谈TypeScript 用 Webpack/ts-node 运行的配置记录

    下面我将详细讲解“浅谈TypeScript 用 Webpack/ts-node 运行的配置记录”的完整攻略。 1. 准备工作 在开始配置前,我们需要做一些准备工作: 安装 Node.js 我们需要在本地安装 Node.js,来运行和打包 TypeScript 代码。 初始化项目 在项目的根目录下运行以下命令,初始化项目并创建一个 package.json 文…

    node js 2023年6月8日
    00
  • nodeJS实现简单网页爬虫功能的实例(分享)

    下面是 “nodeJS实现简单网页爬虫功能的实例(分享)” 的完整攻略。 简介 网页爬虫是一种自动抓取互联网上数据的技术,可以快速检索网页内容并提取需要的信息,对于开发者或数据分析师来说,网页爬虫是一个高效的数据采集工具。本文主要介绍如何使用NodeJS实现简单的网页爬虫功能。 步骤 第一步:准备工作 在正式开始编写网页爬虫之前,需要在本地安装Node.js…

    node js 2023年6月8日
    00
  • 浅析node连接数据库(express+mysql)

    下面我将详细讲解“浅析node连接数据库(express+mysql)”的完整攻略。 1. 什么是Node连接数据库 在使用Node.js搭建Web服务器时,经常需要与数据库进行交互,用来操作数据库的MySQL数据库是目前最为流行的开源数据库之一。Node.js通过库文件mysqljs来实现对MySQL数据库的连接和操作。 2. 使用Node连接MySQL数…

    node js 2023年6月8日
    00
  • javascript和jQuery中的AJAX技术详解【包含AJAX各种跨域技术】

    下面是关于“javascript和jQuery中的AJAX技术详解【包含AJAX各种跨域技术】”的完整攻略: AJAX简介 AJAX(Asynchronous JavaScript and XML)指的是利用JavaScript在不刷新整个页面的情况下向服务器发送请求和获取响应数据,在前端页面进行异步数据交互的技术。 AJAX 的优点有:用户体验好,可以实现…

    node js 2023年6月8日
    00
  • vue源码解读子节点优化更新

    下面我来详细讲解“Vue源码解读子节点优化更新”的完整攻略。 什么是Vue的子节点优化更新? Vue在更新DOM时,会通过虚拟DOM比较新旧节点,找到需要更新的节点进行重渲染。而子节点优化更新,指的是如果一个组件的子节点中只有一部分需要更新,那么Vue只对需要更新的子节点进行重渲染,而没有变化的子节点则会被跳过。 Vue的子节点优化更新主要是由两个流程实现的…

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

    Node.js API详解之 os模块用法实例分析 简介 Node.js是一款基于Chrome V8引擎的JavaScript开发的服务器端运行环境,提供了许多实用的内置模块,其中os模块是其中之一。 os模块提供了与操作系统相关的一些方法,例如获取系统信息、处理文件路径、获取CPU和内存相关信息等。 应用方法 1. os.arch() os.arch()方…

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