如果仍然连接了socket.io id,请在客户端检查

时间:2017-06-28 15:43:21

标签: javascript websocket socket.io

我想在客户端检查套接字ID是否仍然连接。

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

我已经在几个主题中尝试了答案,但它没有用。

编辑1:实际上,我有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)保持套接字ID为ClientB的原因。因此,如果客户端仍然连接,在客户端检查(来自id)将是有用的。如果这个检查需要询问服务器就可以了,我只想让这个检查尽可能简单明了。

2 个答案:

答案 0 :(得分:1)

我建议每隔30秒左右发送一次广播,这样你就不会失去与套接字的连接。

window.setInterval(function(){
    yoursocket.emit('broadcast');
}, 30000 /* 30 sec */);

答案 1 :(得分:1)

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

您可以让clientA询问服务器是否认为clientB已连接(通过在请求消息中将clientB的socket.id发送到服务器),服务器可以回复它对clientB的连接状态的了解

服务器维护所有已连接客户端的列表。您可以访问该列表的方法之一是通过socket.id索引的地图。因此,服务器很容易看到连接的客户端是否在具有给定socket.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属性,该属性反映了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已经实现了自己从服务器发送到客户端的心跳,因此通常会注意到连接何时停止工作。默认情况下,它将尝试重新连接,但如果重新连接不能立即生效,则套接字可能会在重新进行重新连接时保持断开连接状态。