nodejs+socket.io实现p2p消息实时发送的项目实践

下面是「nodejs+socket.io实现p2p消息实时发送的项目实践」的攻略。

1.背景

本项目通过搭建一个基于实时通信的 p2p 网络,实现在任意两个节点之间进行实时消息传递的功能。具体实现技术由 Node.js 和 Socket.IO 提供支持,其主要原理是在每个用户连接到服务器(Socket.IO 服务器)时,将其与其他在线用户连接起来,然后进行实时消息传递。

2. 准备工作

首先,需要安装 Node.js 和 Socket.IO。Node.js 是一个基于 Chrome 的 V8 引擎,用于构建高效的网络应用程序的 JavaScript 运行时。Socket.IO 是一个基于 Node.js 的实时网络库,用于在客户端和服务器之间进行实时通信。

可以通过以下命令行安装 Node.js 和 Socket.IO:

# 安装 Node.js
sudo apt-get install nodejs npm

# 安装 Socket.IO
npm install socket.io

3. 项目实践

在此示例中,我们将演示如何设置基于 Node.js 和 Socket.IO 的服务器和客户端以进行实时消息传递。

3.1. 服务器端

在创建一个 Socket.IO 服务器之前,需要先安装 Socket.IO。可以使用以下命令行完成此操作:

npm install socket.io

接下来,将以下代码段保存到名为 server.js 的文件中:

const io = require('socket.io')(3000, {
  cors: {
    origin: "http://localhost:8080",
    methods: ["GET", "POST"]
  }
});

io.on('connection', (socket) => {
  console.log('a user connected');
  socket.on("chat message", (msg) => {
    io.emit("chat message", msg);
  });
  socket.on('disconnect', () => {
    console.log('user disconnected');
  });
});

该文件将创建一个名为 io 的 Socket.IO 服务器实例,并在本地主机上的端口 3000 上启动。

在此示例中,我们使用 Socket.IO 的 io.emit() 方法,将到达的所有消息广播给所有连接的客户端。当客户端连接到服务器时,将触发 on('connection') 事件,并向控制台输出“a user connected”消息。当客户端断开连接时,将触发 on('disconnect') 事件,并向控制台输出“user disconnected”消息。

最后,在命令行中运行以下命令来启动 Socket.IO 服务器:

node server.js

3.2. 客户端

要让客户端连接到 Socket.IO 服务器并进行实时消息传递,需要执行以下步骤:

  1. 引用 Socket.IO 库
  2. 建立与服务器的连接
  3. 发送和接收消息

以下是一个示例客户端实现:

<!DOCTYPE html>
<html>

<head>
  <meta charset="UTF-8">
  <title>P2P Messaging</title>
</head>

<body>
  <h1>P2P Messaging</h1>
  <ul id="messages"></ul>
  <form id="chat-form">
    <input id="chat-input" placeholder="Type a message">
    <button type="submit">Send</button>
  </form>
  <script src="https://cdn.socket.io/4.0.1/socket.io.min.js"></script>
  <script>
    const socket = io("http://localhost:3000");

    const messageList = document.getElementById("messages");
    const chatForm = document.getElementById("chat-form");
    const chatInput = document.getElementById("chat-input");

    chatForm.addEventListener("submit", (e) => {
      e.preventDefault();
      const message = chatInput.value;
      chatInput.value = "";
      socket.emit("chat message", message);
    });

    socket.on("chat message", (msg) => {
      const item = document.createElement("li");
      item.textContent = msg;
      messageList.appendChild(item);
    });
  </script>
</body>

</html>

在此示例中,我们使用 Socket.IO 的 io() 方法创建了名为 socket 的客户端实例,并将其连接到我们的 Node.js 服务器。通过使用 socket.emit(),我们可以发送到服务器的“chat message”消息。在 socket.on('chat message') 事件中,我们接收服务器发送的来自其他客户端的消息,并将其添加到页面上的聊天消息列表中。

4. 示例说明

以下是本示例中的两个示例说明:

4.1. 示例1

在此示例中,我们假设使用 filename1filename2 两个文件名之间的 WebSocket 进行 p2p 通信。

  1. filename1 中,将以下代码段保存到名为 server.js 的文件中以启动服务端:

```javascript
const io = require('socket.io')(3000, {
cors: {
origin: "http://localhost:8080",
methods: ["GET", "POST"]
}
});

io.on('connection', (socket) => {
console.log('a user connected');
socket.on("chat message", (msg) => {
io.emit("chat message", msg);
});
socket.on('disconnect', () => {
console.log('user disconnected');
});
});
```

  1. filename2 中,添加以下代码以启动客户端并与服务器建立连接:

```html




Open the browser console and watch the messages roll in!

```

  1. 启动两个终端,并分别进入到 filename1filename2 所在的目录下。

  2. 在第一个终端中,运行以下命令以启动 filename1 服务器:

bash
node server.js

  1. 在第二个终端中,运行以下命令以启动 filename2 客户端:

bash
xdg-open index.html

  1. filename2 的网页打开后,在 filename1 的命令行中输入消息,观察消息时候能够实时发送。

4.2. 示例2

在此示例中,我们将展示如何使用面向对象的方法在类中封装 p2p 通信策略。

  1. filename3 中,将以下代码段保存到名为 P2PStrategy.js 的文件中:

```javascript
class P2PStrategy {
constructor(host) {
this.socket = io(host);
}

 sendMessage(message) {
   this.socket.emit("chat message", message);
 }

 onNewMessage(callback) {
   this.socket.on("chat message", (msg) => {
     callback(msg);
   });
 }

 disconnect() {
   this.socket.disconnect();
 }

}

module.exports = P2PStrategy;
```

  1. filename4 中,创建一个名为 app.js 的文件,并将以下代码保存到其中:

```javascript
const P2PStrategy = require('./P2PStrategy.js');

const server = new P2PStrategy('http://localhost:3000');

server.onNewMessage((msg) => {
console.log(msg);
});

server.sendMessage("Hello, world!");

server.disconnect();
```

此处我们引入了 P2PStrategy 类,通过 new P2PStrategy 生成对象,并通过 .sendMessage() 方法将消息发送出去。并通过 .onNewMessage() 方法监听新消息。最后,通过 .disconnect() 方法断开与服务器的连接。

  1. filename3 中启动服务器:

bash
node server.js

  1. filename4 中启动客户端:

bash
node app.js

  1. filename3 中输入消息,直接在控制台中观察消息是否正常发送。

总结

在本文中,我们使用了 Node.js 和 Socket.IO 解决了实时消息传递的问题,并且通过面向对象的方法封装了 p2p 通信策略。通过这个案例,读者可以学习到如何使用 Socket.IO 实现实时通信,并应用于实际项目开发中。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:nodejs+socket.io实现p2p消息实时发送的项目实践 - Python技术站

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

相关文章

  • Node.JS事件的绑定与触发示例详解

    Node.JS事件的绑定与触发示例详解 事件是 Node.js 架构中一个重要的概念,它提供了一种异步编程思想,使得多个操作能够并行执行,提高效率和性能。Node.js 中的事件模块 EventEmitter 提供了统一的事件绑定、触发和监听机制,本文将详细介绍 Node.js 事件的绑定、触发和监听,以及在应用程序中使用事件的示例。 什么是事件? 在 No…

    node js 2023年6月8日
    00
  • node.js生成与读取csv文件方法详解

    什么是CSV文件 CSV文件是一种通用的电子数据表格文件格式,它通常存储表格数据,每行代表一行数据记录,每列代表数据的一个字段。 CSV文件的优点是易于生成和读取,而且可以在不同的软件程序之间轻松共享和交换。在Node.js中,我们可以使用许多模块来生成和读取CSV文件。 如何生成CSV文件 在Node.js中,我们可以使用csv-writer模块来生成CS…

    node js 2023年6月8日
    00
  • Node.js + Redis Sorted Set实现任务队列

    下面是关于“Node.js + Redis Sorted Set实现任务队列”的完整攻略。 什么是任务队列 任务队列是一种用于处理异步任务的机制,在异步任务处理过程中,时常需要将任务放到队列中依次执行。常见的任务队列应用场景有多种,例如:邮件投递、消息提醒等。在这些场景下,任务的执行需要满足先进先出的原则。 Redis Sorted Set Redis So…

    node js 2023年6月8日
    00
  • 教你彻底搞懂ESM与CJS互相转换

    教你彻底搞懂ESM与CJS互相转换 在讲解转换之前,我们需要先了解ESM(ECMAScript Modules)和CJS(CommonJS Modules)的基本概念。 ESM和CJS概念 ESM ESM是一种ECMAScript规范化模块格式,它是ECMAScript 6标准中引入的,它使用import/export关键字进行模块的导入/导出。 示例代码:…

    node js 2023年6月9日
    00
  • 在Debian(Raspberry Pi)树莓派上安装NodeJS的教程详解

    当在Debian (Raspberry Pi)上安装NodeJS时,我们需要按照以下步骤进行操作: 步骤1:更新系统 在安装任何新软件之前,请确保更新您的系统。为此,请打开终端并输入以下命令: sudo apt-get update sudo apt-get upgrade 步骤2:安装NodeJS 可以通过以下任意一种方法来安装NodeJS: 方法1:通过…

    node js 2023年6月8日
    00
  • JS使用贪心算法解决找零问题示例

    首先,让我们了解一下什么是贪心算法。贪心算法(Greedy algorithm)在每一步选择中都采取在当前状态下最优的选择,从而希望导致结果是全局最优的算法。在找零钱的问题上,贪心算法指的是在找零过程中,每次选取最大的面额进行找零。以下是使用JS实现贪心算法解决找零问题的步骤: 排序 对于现金支付金额和硬币面额数组,我们可以先对硬币面额数组进行从大到小的排序…

    node js 2023年6月8日
    00
  • Zabbix添加Node.js监控的方法

    下面是“Zabbix添加Node.js监控的方法”的完整攻略以及两个示例说明: 1. 安装Zabbix agent 首先确保在要监控的服务器上已经安装了Zabbix agent,如果没有安装可以通过以下命令安装: $ sudo apt-get update $ sudo apt-get install zabbix-agent 安装完成后,确保Zabbix …

    node js 2023年6月8日
    00
  • Node批量爬取头条视频并保存方法

    以下是“Node批量爬取头条视频并保存方法”的完整攻略: 1. 准备工作 首先,需要确保已经安装了Node.js和npm。然后,安装所需的依赖模块:cheerio和request-promise。安装命令如下: npm install cheerio request-promise 2. 获取视频列表 爬取头条视频,需要先获取视频列表。可以通过头条的API接…

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