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

yizhihongxing

下面是「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中 stream使用教程

    下面是“node.js中 stream使用教程”的完整攻略。 什么是Stream Stream(流)是Node.js中处理流式数据的抽象接口。Stream 的各种实现在 Node.js 中广泛使用,它们提供了构建实时数据处理系统的基础。常见的 Stream 类型包括: Readable: 可读流 Writable: 可写流 Duplex: 双工流,即可读可写…

    node js 2023年6月8日
    00
  • nodejs 日志模块winston的使用方法

    下面是关于“nodejs 日志模块winston的使用方法”的完整攻略: 什么是winston winston 是一个流行的 Node.js 日志记录库。它允许开发人员在应用程序中方便地配置、记录和存储日志消息,而无需编写适用于多个日志级别的自定义代码。winston 支持多种目标,例如文件、数据库、控制台和 syslog。 安装winston 在Node.…

    node js 2023年6月8日
    00
  • 理解 Node.js 事件驱动机制的原理

    理解 Node.js 事件驱动机制的原理,需要掌握以下几个关键概念和步骤: 事件循环:Node.js 是单线程的,使用事件循环机制来实现异步操作。事件循环是 Node.js 的核心,所有的异步 I/O 操作都依赖它。 异步 I/O:Node.js 通过异步 I/O 操作实现高效的非阻塞式操作,这样可以提高程序的吞吐量和响应速度。 事件队列:事件队列是保存在事…

    node js 2023年6月8日
    00
  • 详解node和ES6的模块导出与导入

    详解node和ES6的模块导出与导入 什么是模块 模块是JS代码的组织单元。一个模块中包含了一些独立的、可重用的代码。模块化提供了更好的代码重用,更好的代码管理,并且可以提供更好的性能。 在早期,JS程序的模块化靠的是IIFE(立即执行函数表达式)模式。但是这种模式需要手动处理模块依赖关系并且容易出错。 现代 JS 应用的模块化通常采用 ES6 的模块功能,…

    node js 2023年6月8日
    00
  • Vue页面渲染中key的应用实例教程

    下面是关于“Vue页面渲染中key的应用实例教程”的完整攻略: 什么是key key是一个特殊的属性,用于协助Vue区分每个节点的身份,以便在不同的渲染情况下识别其应有的状态。在Vue中,key主要用于优化虚拟DOM的渲染效率。 常见应用场景 列表渲染 在Vue中,当使用v-for指令进行列表渲染时,每个元素都需要指定一个唯一的key,以便Vue能够正确地追…

    node js 2023年6月8日
    00
  • JavaScript Image对象实现原理实例解析

    以下是关于“JavaScript Image对象实现原理实例解析”的详细攻略: 1. 简介 在网页中,图片展现是很常见的一种基础性操作。JavaScript中的Image对象可以帮助我们更好地处理图片相关的逻辑,比如加载图片、判断图片是否加载完成等等。下面我们就对其实现原理进行详解。 2. 实现原理 2.1 创建Image对象 在JavaScript中,我们…

    node js 2023年6月8日
    00
  • 利用node.js制作命令行工具方法教程(一)

    以下是“利用node.js制作命令行工具方法教程(一)”的完整攻略: 1. 命令行工具是什么 命令行工具(Command-Line Tool)是通过命令行(Command-Line Interface, CLI)交互的方式运行的应用程序。命令行工具通过解析命令行参数来执行特定的操作。在Node.js中,我们可以利用process.argv来获取命令行参数,在…

    node js 2023年6月8日
    00
  • node.js实现逐行读取文件内容的代码

    想要实现逐行读取文件内容,首先需要使用node.js提供的fs模块中的createReadStream方法来创建可读流。 在创建可读流时可以指定一个encoding参数来指定读取的文件编码格式,如下所示: const fs = require(‘fs’); const readline = require(‘readline’); const rl = re…

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