我想在客户端检查套接字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)将是有用的。如果这个检查需要询问服务器就可以了,我只想让这个检查尽可能简单明了。
答案 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已经实现了自己从服务器发送到客户端的心跳,因此通常会注意到连接何时停止工作。默认情况下,它将尝试重新连接,但如果重新连接不能立即生效,则套接字可能会在重新进行重新连接时保持断开连接状态。