node.js中的Socket.IO使用实例

当提到实现实时的网络通信时,Socket.IO可以说是一个非常不错的选择。 它是用 Node.js 实现的,可以让你轻松地在前后端之间建立实时、双向、基于事件的通信。

下面我将提供一个 Socket.IO 的使用实例,以便了解如何在 Node.js 服务器和客户端之间使用它来实现实时通信。

安装Socket.IO

在开始使用Socket.IO之前,我们需要确保在系统上已经安装了Node.js。

在继续之前,我们需要使用 npm 安装 Socket.IO :

npm install socket.io

启动Socket.IO服务端

首先我们开始创建 server.js 文件,用于创建和启动Websocket服务。

const IO = require('socket.io');
const http = require('http');

const server = http.createServer();
const io = IO(server);

io.on('connect', (socket) => {
  console.log('a user connected');

  socket.on('disconnect', () => {
    console.log('user disconnected');
  });

  socket.on('chat message', (msg) => {
    console.log(`message: ${msg}`);
    io.emit('chat message', msg);
  });
});

server.listen(3000, () => {
  console.log('listening on *:3000');
});

上面的代码创建了一个 node.jshttp 服务器,并通过 socket.io 模块创建了一个 socket 实例,用于实现实时通信。 io.on('connect', ...) 用于在客户端连接成功后执行的事件, socket.on(...) 则定义了客户端发送消息时的事件。

其中最重要的是 io.emit('chat message', msg); 用于向所有连接上的客户端发送消息。

客户端使用Socket.IO

我们已经完成了服务端部分的 socket 配置,接下来我们来看看如何在客户端中使用它。创建一个 index.html 页面,添加 Socket.IO 的依赖和测试用例:

<html>
  <head>
    <title>Socket.IO Test</title>
  </head>
  <body>
    <ul id="messages"></ul>
    <form action="">
      <input id="m" autocomplete="off" /><button>Send</button>
    </form>

    <script src="/socket.io/socket.io.js"></script>
    <script>
      const socket = io();
      const input = document.getElementById('m');
      const messages = document.getElementById('messages');

      document.querySelector('form').addEventListener('submit', (event) => {
        event.preventDefault();
        if (input.value) {
          socket.emit('chat message', input.value);
          input.value = '';
        }
      });

      socket.on('connect', () => {
        console.log('connected');
      });

      socket.on('chat message', (msg) => {
        const li = document.createElement('li');
        li.innerText = msg;
        messages.appendChild(li);
      });
    </script>
  </body>
</html>

上面的代码中,我们使用 socket.io.js 来连接服务器进行通信,并定义了一个输入框和一个发送按钮用于发送消息。在客户端成功连接上服务器时,会触发 socket.on('connect', ...) 对应的事件。另外,如果有其他客户端发送了消息,会通过 socket.on('chat message', ...) 对应事件的参数 msg 显示在页面上。

示例1:实现房间聊天功能

实现一个简单的聊天室,可以让多个用户在同一个界面上交流。多个用户可以相互之间发送信息。为了实现这个功能,我们需要通过 Socket.IO 实现多个客户端实例同时连接上服务端,并且在服务器端将每个客户端实例加入相应的房间。客户端向其他客户端发送信息时, 我们将信息广播到房间中的其他客户端实例。

服务端代码

以下是服务端代码:

// 房间名称
const roomName = 'room1';

io.on('connect', (socket) => {
  // 加入房间
  socket.join(roomName);

  // 对方发消息
  socket.on('chat message', (msg) => {
    io.to(roomName).emit('chat message', msg);
  });

  // 离开房间
  socket.on('disconnect', () => {
    console.log(`[${socket.id}] leave room [${roomName}]`);
    socket.leave(roomName);
  });
});

首先,我们定义了一个常量 roomName 作为房间的名称。当客户端连接成功后,将当前连接的客户端加入房间。在用户发出聊天信息时,我们使用 io.to(roomName).emit() 将消息广播到房间里面的每一个连接实例。当客户端断开连接时,需要将其移除离开该房间。

客户端代码

下面是客户端代码:

// 发送消息
socket.emit('chat message', message);

// 当接收到聊天信息时处理
socket.on('chat message', (msg) => {
  ...
});

在客户端,我们将实现客户端和服务端的 Socket.IO 连接。发送聊天信息时,我们通过 socket.emit('chat message', ...) 发出消息。对于收到的消息,我们使用 socket.on('chat message', ...) 来进行处理并显示到页面上。

示例2:实现在线人数统计

在上面的例子中,当多名客户端连接到服务器时,可以实现在客户端之间广播消息。假设我们现在需要对连接到服务器的客户端数量进行统计,并在页面上实时显示在线人数,那么我们需要各种监听器和方法来处理这种情况。

服务端代码

以下是服务端代码:

let onlineCount = 0;

io.on('connect', (socket) => {
  onlineCount++;
  io.emit('count', { onlineCount });

  socket.on('disconnect', () => {
    onlineCount--;
    io.emit('count', { onlineCount });
  });
});

以上代码使用了一个变量 onlineCount 来记录当前服务器上的连接量。当客户端与服务端连接成功时,我们通过 io.emit('count', ...) 向客户端广播当前在线人数。 如果客户端与服务端连接断开,则减去在线人数并再次广播。

客户端代码

以下是客户端代码:

// 声明变量
const onlineDisplay = document.getElementById('onlinecount');

// 当连接到服务器时,显示在线人数
socket.on('connect', () => {
  console.log('connected');

  socket.on('count', ({ onlineCount }) => {
    onlineDisplay.innerText = onlineCount;
  });
});

当客户端连接到服务器时,会触发 socket.on('connect', ...) 对应的事件,同时监听来自服务器的 count 事件。当服务器发出事件时,我们通过 DOM 操作更新在线人数。每当有一个客户端与服务端断开连接时,会广播到所有客户端,并将在线人数减少一个。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:node.js中的Socket.IO使用实例 - Python技术站

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

相关文章

  • Egg框架的功能、原理,以及基本使用方法概述 原创

    Egg框架的功能、原理,以及基本使用方法概述 Egg框架的功能 Egg是一个基于Node.js和Koa的企业级应用开发框架,是一个约定俗成的目录结构和插件机制的框架。Egg框架提供了很多企业级应用开发所需的核心功能: 便捷的路由和控制器机制 简单易用的模板渲染引擎 灵活的插件机制,轻松集成其他插件拓展功能 方便的中间件机制,实现特定的功能 可定制的事件机制,…

    node js 2023年6月8日
    00
  • 解决Nodejs全局安装模块后找不到命令的问题

    当我们使用npm全局安装某个模块时,有时候我们会遇到找不到命令的问题。这是由于Node.js全局安装路径未在系统PATH环境变量中设置的缘故。我们可以按照以下步骤来解决这个问题: 1.找到全局安装路径 使用以下命令可以查看当前Node.js全局安装的路径: npm root -g 该命令会输出Node.js全局安装路径,例如: /usr/local/lib/…

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

    当我们在编写 Node.js 代码时,经常需要拼接不同的路径,这时使用 path.resolve 方法可以非常方便地实现路径拼接和处理,使得路径的操作更加易于维护和扩展。下面,我将为大家详细介绍 path.resolve 方法的使用说明。 1. 方法介绍 path.resolve 方法是 Node.js 提供的基础模块 path 的一个方法,它可以将多个参数…

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

    下面是“node.js中的fs.lstat方法使用说明”的完整攻略。 目录 什么是fs.lstat方法? 如何使用fs.lstat方法? fs.lstat方法的示例 示例一:获取文件的类型 示例二:遍历文件夹 什么是fs.lstat方法? fs.lstat() 方法用于获取指定路径文件或目录的相关信息,包括文件类型、大小、权限等信息。与 fs.stat() …

    node js 2023年6月8日
    00
  • 基于html5和nodejs相结合实现websocket即使通讯

    HTML5和Node.js简介 HTML5是用于Web设计的新一代标准,支持本地存储、多媒体、拖放和各种新元素的引入。 Node.js是一个基于V8引擎的开源、跨平台的javascript运行环境,可以帮助我们使用javascript编写服务器端代码。 WebSocket的优势和使用场景 WebSocket是HTML5标准中的一个协议,它可以在浏览器和服务器…

    node js 2023年6月8日
    00
  • Node.js数据库钩子的使用

    Node.js是一个非常流行的服务器端运行时环境,可以使用它来构建高效的应用程序。在Node.js应用程序中,我们经常需要连接到数据库,并在数据库读取或写入数据时执行某些操作。Node.js提供了一种非常强大的技术 – 数据库钩子,可以用于在数据库读写操作的执行前或执行后自动执行某些特定的代码。 什么是数据库钩子 数据库钩子是一种让你在数据库执行查询或写入操…

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

    当我们需要删除一个文件时,我们可以使用Node.js中的fs.unlink()方法。该方法可以从文件系统中删除指定的文件。 fs.unlink()方法的使用说明 语法: fs.unlink(path, (err) => { if (err) throw err; console.log(‘文件已成功删除’); }); 参数说明: path:一个字符串,…

    node js 2023年6月8日
    00
  • 通过V8源码看一个关于JS数组排序的诡异问题

    下面来详细讲解“通过V8源码看一个关于JS数组排序的诡异问题”的完整攻略。 1. 了解排序算法 首先,我们需要了解常见的排序算法,例如快速排序、冒泡排序、插入排序等。了解这些算法可以帮助我们更好地理解JS内置的Array.prototype.sort()方法是如何进行排序的。 2. 查看V8源码 V8是Node.js和Google Chrome浏览器的Jav…

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