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日

相关文章

  • nodejs基于WS模块实现WebSocket聊天功能的方法

    Node.js是基于Chrome V8引擎构建的一个运行时环境,可以让JavaScript运行在服务器端,WS是一种基于TCP协议之上进行端到端传输的网络协议,用于实现浏览器与服务器双向通信。结合使用Node.js和WS模块可以实现WebSocket聊天功能。 以下是实现WebSocket聊天功能的方法: 1. 安装WS模块 可以使用npm命令安装WS模块,…

    node js 2023年6月8日
    00
  • Node.js实用代码段之获取Buffer对象字节长度

    获取Buffer对象字节长度是在Node.js中处理二进制数据时非常常见的操作之一。本文将介绍如何在Node.js中获取Buffer对象字节长度的各种方法以及它们的优缺点。 1.使用Buffer.length获取字节长度 通过Buffer.length属性可以获取Buffer对象的字节长度。这种方法对于小型的Buffer对象非常有效,但是当需要处理大型的Bu…

    node js 2023年6月8日
    00
  • Node.js高级编程cluster环境及源码调试详解

    Node.js高级编程cluster环境及源码调试详解 本文将详细讲解 Node.js 的 cluster 环境及源码调试,包含以下内容: 理解Cluster Cluster 是 Node.js 的一个核心模块,它允许你创建一组子进程来共享同一个服务器端口,并在每个子进程之间分配工作负载。这就允许我们利用服务器的所有 CPU 核心,以提高 Node.js 应…

    node js 2023年6月8日
    00
  • node中使用log4js4.x版本记录日志的方法

    当我们在使用Node.js编写应用时,日志记录是不可避免的需求。而log4js是一个广泛使用的Node.js日志记录库,其提供了很多有用功能。在本篇攻略中,我将向大家讲解如何在Node.js应用中使用log4js v4.x版本记录日志。 安装log4js 首先,我们需要安装log4js。使用以下命令可在Node.js项目中安装log4js: npm inst…

    node js 2023年6月8日
    00
  • Node.js的模块化机制和Buffer对象详解

    使用Node.js开发应用时,模块化机制和Buffer对象是非常重要的概念,本文将详细讲解这两个方面的内容。 Node.js的模块化机制 Node.js采用了CommonJS规范来实现模块化,该规范定义了模块化的四个重要部分:模块定义、模块标识、模块引用和模块缓存。 模块定义 在Node.js中,每个文件都是一个模块。模块定义通过module.exports…

    node js 2023年6月8日
    00
  • Luvit像Node.js一样写Lua应用

    Luvit是一个基于Lua语言的异步I/O框架,它可以让你像Node.js一样写Lua应用程序。本文将介绍如何使用Luvit来构建异步I/O的程序。 安装Luvit 在开始使用Luvit之前,首先需要安装Luvit。安装Luvit很容易,只需按照以下步骤操作: 前往Luvit官网(https://luvit.io/),点击下载按钮,选择对应的操作系统和CPU…

    node js 2023年6月8日
    00
  • js AppendChild与insertBefore用法详细对比

    当我们要向HTML页面中增加新的元素节点时,可以使用JS的appendChild和insertBefore方法。两者都可以用于向一个父元素节点中添加一个子元素节点,但有些细节不同。下面是对比它们的用法的详细攻略。 使用appendChild方法 appendChild方法是用于在一个元素节点的子节点列表的末尾添加一个新的子元素节点。其语法如下: parent…

    node js 2023年6月8日
    00
  • nodejs中模块定义实例详解

    Node.js中的模块定义是一个非常重要的概念,它允许开发者将代码片段和功能封装在一个可重用的单元中,以便在程序中其他地方使用。同时,模块定义也被广泛地应用于Node.js中各种第三方库和框架,因此良好的模块定义实践方法可以提升模块的可维护性和复用性。 1. 模块定义 一个Node.js模块通常包含两部分: 模块引入部分,以便在程序中引入模块,并定义该模块的…

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