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

yizhihongxing

当提到实现实时的网络通信时,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日

相关文章

  • nodejs acl的用户权限管理详解

    Node.js ACL的用户权限管理详解 概述 在Node.js应用中,用户权限管理是非常重要的一个功能,其中一个常用的实现方式是使用 node_acl 模块。 node_acl 是一个封装了 redis 的简单的权限控制列表模块,在许多 Node.js 应用程序中都被广泛使用。 ACL 模块的核心思想是,在用户请求时,检查这个用户是否有权限执行特定的操作,…

    node js 2023年6月8日
    00
  • 利用C/C++编写node.js原生模块的方法教程

    以下是关于“利用C/C++编写node.js原生模块的方法教程”的完整攻略: 什么是Node.js原生模块? Node.js 是一个流行的 JavaScript 运行时环境,允许开发人员使用 JavaScript 编写服务器端应用程序。Node.js 有一个重要的标准模块库,包括文件系统、HTTP 等基本的模块。此外,Node.js还允许开发人员编写自己的模…

    node js 2023年6月8日
    00
  • Puppeteer 爬取动态生成的网页实战

    Puppeteer 爬取动态生成的网页实战攻略 介绍 Puppeteer 是一个由 Google 开源的 Node.js 库,它提供了一个高级的 API 来与 headless Chrome 进行交互。Puppeteer 可以模拟用户的交互行为,并且可以获取网页中动态生成的内容,非常适合用来做爬虫。 步骤 1. 安装 Puppeteer 在安装 Puppet…

    node js 2023年6月8日
    00
  • node.js-fs文件系统模块这是你知道吗

    Node.js提供了fs模块,用于进行文件系统操作。该模块提供了许多与文件和文件夹相关的功能,例如读取文件、写入文件、创建文件夹、删除文件夹等等。 读取文件 要读取文件,可以使用fs.readFile方法。该方法接受两个参数:文件路径和回调函数。回调函数将返回一个错误(如果有的话)和一个带有文件内容的数据缓冲区。 以下是一个读取文件并在控制台上输出其内容的示…

    node js 2023年6月8日
    00
  • Docker + Nodejs + Kafka + Redis + MySQL搭建简单秒杀环境

    下面我将详细讲解“Docker + Nodejs + Kafka + Redis + MySQL搭建简单秒杀环境”的完整攻略。 1. 前置条件 在开始搭建秒杀环境之前,需要先安装Docker和Docker Compose,并确保已经熟悉Docker和Docker Compose的基本使用。 2. 搭建过程 2.1 新建项目目录 首先,新建一个项目目录,比如s…

    node js 2023年6月8日
    00
  • node后端与Vue前端跨域处理方法详解

    一、 前言 在前后端分离的开发模式中,前端Vue与后端Node进行沟通交互涉及到跨域问题。下面我们来详细讲解node后端与Vue前端跨域处理方法。 二、 跨域原理 同源策略(Same Origin Policy)要求网页只能访问与本网页同一个域名、端口、协议的网页。也就是说,一个源的的脚本仅能读写属于该源的窗口和文档。如果读写的目标不是同源的,就会出现跨域问…

    node js 2023年6月8日
    00
  • nodejs实例解析(输出hello world)

    Node.js是基于Chrome V8引擎开发的运行在服务器端的JavaScript运行环境,提供了一种轻量级、高效、可扩展的方式来搭建网络应用程序。下面是如何使用Node.js输出“hello world”的攻略。 准备工作 在开始之前,请确保已经安装了Node.js。可以在命令行中输入以下命令检查是否已经安装: node -v 如果已经安装,则会输出安装…

    node js 2023年6月8日
    00
  • Vue指令工作原理实现方法

    Vue 指令是 Vue 模板中的特殊语法,它们以 v- 开头,用于对元素、组件或者DOM元素进行特定的绑定和操作。例如,v-for 用于循环渲染列表数据,v-if 用于条件渲染,v-bind 用于动态绑定属性等等。 Vue 指令的工作原理是基于 Vue.js 内部解析模板时实现的。当 Vue.js 开始执行编译模板的过程时,会将模板转换为虚拟 DOM 树,并…

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