我想在客户端检查套接字 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/