Nodejs 如何关闭socket

Nodejs 如何关闭socket

如何关闭后台socket的heartbeat工作 前台
socket=io.connect(‘http://localhost/room3’); $("#m_quit").on(‘click’,function(){ alert(“123”); socket.disconnect(); })

后台 socket.on(‘disconnect’,function(data){ console.log(“done”); }); 可是点点击按钮后,后台打出done之后还是会有 emitting heartbeat for client gEICs9YUPNv99Lj6bUiA websocket writing 2:: set heartbeat timeout for client gEICs9YUPNv99Lj6bUiA got heartbeat packet cleared heartbeat timeout for client gEICs9YUPNv99Lj6bUiA set heartbeat interval for client gEICs9YUPNv99Lj6bUiA

这样是不是还没有关闭掉。。。

另外,我在前面,有对各个连接保存socket room3=io.of(’/room3’).on(‘connection’,function(socket){ var session = socket.handshake.session;//session var id=socket.id; name[id] = session.user.name;//session的用户名 players[name[id]]=socket;//保存通信句柄 通过用户名来区分

如何关闭某一个 players[]里的socket呢??


7 回复

Node.js 如何关闭 socket

前台代码

首先,我们需要确保前台的 socket 能够正确地断开连接。你可以使用 socket.disconnect() 方法来关闭客户端的连接。

// 前台
let socket = io.connect('http://localhost/room3');

$("#m_quit").on('click', function() {
    alert("123");
    socket.disconnect();
});

后台代码

在后台,你需要处理客户端断开连接的事件,并且确保心跳机制也被正确停止。心跳机制通常由 Socket.IO 自动管理,但你可以通过自定义逻辑来控制它。

const io = require('socket.io')(server); // server 是你的 HTTP 服务器实例

io.of('/room3').on('connection', function(socket) {
    let session = socket.handshake.session; // 获取会话信息
    let id = socket.id;
    name[id] = session.user.name; // 保存用户名
    players[name[id]] = socket; // 保存通信句柄

    // 处理客户端断开连接
    socket.on('disconnect', function(reason) {
        console.log(`Client disconnected: ${reason}`);
        delete players[name[id]]; // 从 players 中删除该 socket
    });

    // 手动停止心跳机制(如果需要)
    socket.on('manualDisconnect', function() {
        socket.disconnect();
    });
});

关闭特定的 socket

如果你想要关闭 players 数组中的某个 socket,可以通过以下方式实现:

function closeSocket(username) {
    if (players[username]) {
        players[username].disconnect();
        delete players[username];
    }
}

// 示例调用
closeSocket('someUsername');

解释

  • 前台:当用户点击按钮时,触发 socket.disconnect() 方法来断开与服务器的连接。
  • 后台:服务器接收到客户端的断开连接事件后,可以在 socket.on('disconnect', ...) 回调中执行清理操作,例如从 players 对象中删除相应的 socket。
  • 手动停止心跳机制:如果你需要手动停止心跳机制,可以在 socket.on('manualDisconnect', ...) 中调用 socket.disconnect()

以上代码应该能够帮助你正确地关闭 socket 连接,并处理相关的清理操作。


在服务端disconnect事件中使用这句:delete players[name[id]];

这样应该只是把该连接移除出队列,而本身并没有销毁这个连接吧。

肯定销毁了啊~

只要客户端浏览器关掉, 就自动disconnect了

要关闭Socket.IO客户端上的socket并停止心跳检测,可以使用socket.disconnect()方法。然而,从你的描述来看,尽管前端已经调用了socket.disconnect(),后端仍然继续发送心跳检测消息。这可能是因为Socket.IO的默认行为是尝试重新连接。

以下是一些步骤和代码片段来解决这个问题:

  1. 确保前端正确断开连接:

    $("#m_quit").on('click', function() {
      socket.disconnect(); // 断开与服务器的连接
    });
    
  2. 在后端处理disconnect事件: 确保你在后端正确处理了disconnect事件,并且没有后续的心跳检测逻辑:

    io.of('/room3').on('connection', function(socket) {
      console.log("New client connected");
    
      socket.on('disconnect', function() {
        console.log("Client disconnected");
        // 你可以在这里清理资源
      });
    
      // 其他事件处理
    });
    
  3. 如果需要关闭特定用户的socket: 你可以在后端维护一个players对象来存储所有连接的socket,并提供一个方法来关闭特定的socket:

    let players = {};
    
    io.of('/room3').on('connection', function(socket) {
      const sessionId = socket.handshake.sessionID;
      players[sessionId] = socket;
    
      socket.on('disconnect', function() {
        delete players[sessionId];
        console.log("Client disconnected");
      });
    });
    
    // 关闭特定用户socket的方法
    function closeSocket(sessionId) {
      if (players[sessionId]) {
        players[sessionId].disconnect();
        delete players[sessionId];
      }
    }
    
  4. 停止心跳检测: 如果你想完全禁用心跳检测功能,可以通过修改Socket.IO的配置来实现。例如,在初始化时设置心跳间隔为无穷大(理论上无限长):

    const io = require('socket.io')(server, {
      heartbeatInterval: Infinity,
      pingTimeout: Infinity
    });
    

以上步骤应该能帮助你正确地关闭socket并停止心跳检测。

回到顶部