顯然(從您的意見),客戶端A具有clientB的socket.id
和客戶端A想知道clientB當前連接。由於socket.id
只是一個字符串值,因此clientA無法從socket.id
得知客戶端B是否已連接。這些信息必須來自服務器。
您可以讓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已經實現了從服務器發送到客戶自己的心跳所以當連接停止工作,它通常會注意到。默認情況下,它將嘗試重新連接,但是如果該重新連接不能立即工作,那麼套接字可能會在重新嘗試進一步重新連接時保持斷開連接狀態。
如果我只有套接字ID而不是套接字對象,該怎麼辦? – SoftTimur
@SoftTimur - 'socket.id'是服務器端的東西,但是你的代碼是客戶端的。我很困惑。您將需要獲得客戶端套接字對象來使用此標誌。如果你想得到更多的幫助,將不得不展示更多的代碼。我回答了你問的具體問題。你現在要問的是別的。如果你有一個其他客戶端的'socket.id',並且你想知道客戶端是否連接,這是一個完全不同的問題,你應該開始一個新的問題,並且完全解釋你想要做什麼,包括顯示所有相關的代碼。 – jfriend00
我最初的問題是** ** id **,它確實來自服務器端。我並不是說我們不應該讓服務器檢查連接狀態。當我有我的電腦時,我會顯示更多的代碼。 – SoftTimur