javascript - 检查客户端是否有 socket.io id 仍然连接

标签 javascript websocket socket.io

我想在客户端检查套接字 ID 是否仍处于连接状态。

socket.io的版本我用的是<script src="/socket.io/socket.io.js"></script> .

我已经在多个线程中尝试过答案,但没有成功。

编辑1:实际上,我有一台服务器可以为许多客户端提供服务。在服务器中,我有以下代码,它在连接时将套接字 id 发送到客户端:

io.sockets.on('connection', function (socket) {
  console.log("LOG: just connected: " + socket.id);    
  socket.emit('id', socket.id);    
  socket.on('disconnect', function () {
    console.log("LOG: just disconnected: " + socket.id)
  })
})

两个客户端可以通过服务器相互通信,这就是 ClientA 的原因可以(除了它自己的套接字ID)保留ClientB的套接字ID 。因此,对于我来说,在客户端检查(从 id)客户端是否仍处于连接状态将很有用。如果这个检查需要询问服务器就可以了,我只是希望这个检查尽可能简单和确定。

最佳答案

显然(根据您的评论),clientA 有 clientB 的 socket.id 并且 clientA 想知道 clientB 当前是否已连接。由于 socket.id 只是一个字符串值,因此 clientA 无法仅通过 socket.id 判断 clientB 是否已连接。该信息必须来自服务器。

您可以让 clientA 询问服务器是否认为 clientB 已连接(通过在请求消息中将 clientB 的 socket.id 发送到服务器),服务器可以用它所知道的有关 clientB 连接状态的信息进行响应。

服务器维护所有连接的客户端的列表。访问该列表的方法之一是通过由 socket.id 索引的 map 。因此,服务器可以很容易地查看已连接的客户端是否位于具有给定套接字.id 的映射中。

这里有一种方法可以询问服务器是否已连接给定的 socket.id。这将是您的服务器代码:

io.sockets.on('connection', function (socket) {
  console.log("LOG: just connected: " + socket.id);    
  socket.emit('id', socket.id);    
  socket.on('disconnect', function () {
    console.log("LOG: just disconnected: " + socket.id)
  })

  // use the ack function argument to send a response back
  socket.on('isConnected', function(id, ackFn) {
      let otherSocket = io.sockets.connected[id];
      ackFn(!!otherSocket && otherSocket.connected);
  });
});

并且,客户端将发送请求并监听响应:

socket.emit('isConnected', someId, function(result) {
    console.log(someId + ": " + result ? "is connected" : "is not connected");
});
<小时/>

原始答案认为您是在问客户端如何判断自己的套接字是否已连接。

socket.io 对象有一个 .connected 属性,该属性反射(reflect)了 socket.io 认为的当前连接状态。

 if (socket.connected) {
     // socket.io thinks it is still connected
 }

您可以在此处看到它的使用 internally in the .emit() method :

if (this.connected) {
  this.packet(packet);
} else {
  this.sendBuffer.push(packet);
}

Socket.io 已经实现了从服务器到客户端发送的自己的心跳,因此它通常会注意到连接何时停止工作。默认情况下,它将尝试重新连接,但如果重新连接不能立即工作,套接字可能会保持在断开状态,同时重试进一步重新连接。

关于javascript - 检查客户端是否有 socket.io id 仍然连接,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44807145/

相关文章:

javascript - kineticjs "cannot call method ' 未定义的appendChild”

javascript - 延迟加载图像如何

c++ - aws-cpp-sdk : How to IoT publish using MQTT over Web Socket (in c++)

javascript: 打印 websocket 客户端 IP

node.js - ExpressJS、MongoDB + Socket.IO - 识别单个用户 session

javascript - d3.js 和 document.onReady

javascript - 创建具有左侧菜单和右侧内容的简单网站

python web-socket 客户端此日志记录来自哪里?

javascript - 无法访问socket.html

node.js - 使用 socket.io 的客户端库