请问怎么通过Nodejs socket.io 知道网络是否畅通

请问怎么通过Nodejs socket.io 知道网络是否畅通

socket.io 官网的文档的确看不太懂……

4 回复

要通过 Node.js 和 Socket.IO 检测网络是否畅通,可以通过发送心跳包(heartbeat)的方式来实现。心跳包是一种简单的机制,用于定期检测客户端与服务器之间的连接状态。如果心跳包成功发送并收到响应,则可以认为网络是畅通的。

以下是一个简单的示例代码,展示了如何使用 Node.js 和 Socket.IO 来实现心跳包机制:

服务器端代码

const express = require('express');
const http = require('http');
const socketIo = require('socket.io');

const app = express();
const server = http.createServer(app);
const io = socketIo(server);

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

    // 设置心跳间隔时间(毫秒)
    const heartbeatInterval = 5000; // 5秒
    let heartbeatTimer;

    // 发送心跳包
    function sendHeartbeat() {
        socket.emit('heartbeat', 'ping');
        console.log('Heartbeat sent');
    }

    // 接收心跳响应
    socket.on('heartbeat', (data) => {
        console.log('Heartbeat received:', data);
        clearInterval(heartbeatTimer); // 清除之前的定时器
        heartbeatTimer = setInterval(sendHeartbeat, heartbeatInterval); // 重新设置定时器
    });

    // 初始启动心跳
    heartbeatTimer = setInterval(sendHeartbeat, heartbeatInterval);

    // 监听断开连接事件
    socket.on('disconnect', () => {
        console.log('User disconnected');
        clearInterval(heartbeatTimer);
    });
});

server.listen(3000, () => {
    console.log('Server is running on port 3000');
});

客户端代码

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Socket.IO Heartbeat Example</title>
</head>
<body>
    <script src="/socket.io/socket.io.js"></script>
    <script>
        const socket = io();

        // 接收心跳包
        socket.on('heartbeat', (data) => {
            console.log('Received heartbeat:', data);
            socket.emit('heartbeat', 'pong'); // 响应心跳包
        });

        // 定期检查心跳响应
        let lastHeartbeatTime = Date.now();
        setInterval(() => {
            if (Date.now() - lastHeartbeatTime > 10000) { // 如果超过10秒没有收到心跳响应
                console.log('No heartbeat response, network may be down');
            }
        }, 1000); // 每秒检查一次
    </script>
</body>
</html>

解释

  1. 服务器端

    • 创建一个 Express 应用和 HTTP 服务器。
    • 使用 socketIo 监听客户端连接事件。
    • 设置一个心跳间隔时间(例如 5 秒),并定期发送心跳包。
    • 当接收到心跳响应时,清除之前的定时器并重新设置新的定时器。
    • 当客户端断开连接时,清除心跳定时器。
  2. 客户端

    • 连接到服务器。
    • 接收心跳包并响应。
    • 定期检查心跳响应的时间差,如果超过一定时间(例如 10 秒),则认为网络可能不畅通。

通过这种方式,你可以有效地检测客户端与服务器之间的网络连接状态。


thanks

要通过 Node.js 和 Socket.IO 检测网络连接是否畅通,可以使用 Socket.IO 的心跳机制(heartbeat)来判断客户端与服务器之间的连接状态。心跳机制默认是开启的,但你可以根据需要调整其配置。

示例代码

首先确保你已经安装了 socket.io

npm install socket.io

然后创建一个简单的服务器端代码:

const http = require('http');
const { Server } = require("socket.io");

const server = http.createServer();
const io = new Server(server, {
  cors: {
    origin: "*",
  },
});

io.on('connection', (socket) => {
  console.log('A user connected:', socket.id);

  // 监听客户端发送的心跳信号
  socket.on('ping', () => {
    console.log('Ping received from client:', socket.id);
    socket.emit('pong'); // 回应一个 pong
  });

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

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

客户端代码:

<!DOCTYPE html>
<html>
<head>
  <title>Socket.IO Ping Test</title>
  <script src="/socket.io/socket.io.js"></script>
</head>
<body>
  <button onclick="sendPing()">Send Ping</button>
  <div id="status">Disconnected</div>

  <script>
    const socket = io('http://localhost:3000');

    socket.on('connect', () => {
      document.getElementById('status').innerText = 'Connected';
    });

    socket.on('pong', () => {
      document.getElementById('status').innerText = 'Pong received!';
    });

    function sendPing() {
      socket.emit('ping'); // 发送 ping 信号
    }
  </script>
</body>
</html>

解释

  1. 服务器端

    • 创建一个 HTTP 服务器,并将其与 Socket.IO 服务器绑定。
    • 使用 io.on('connection', ...) 监听客户端连接事件。
    • 当接收到客户端的 ping 信号时,服务器回应一个 pong 信号。
    • 监听 disconnect 事件以处理客户端断开连接的情况。
  2. 客户端

    • 连接到服务器。
    • 监听 connect 事件以确认连接成功。
    • 监听 pong 信号并更新状态显示。

通过这种方法,你可以检测到客户端与服务器之间的连接状态。如果客户端定期发送 ping 信号并且能收到 pong 响应,说明连接是正常的。

回到顶部