2017-06-28 76 views
-1

我想在客戶端檢查套接字ID是否仍然連接。檢查客戶端是否仍然連接了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)是很有用的。如果這個檢查需要詢問服務器,這將是確定的,我只是希望這個檢查儘可能簡單和可靠。

回答

1

顯然(從您的意見),客戶端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已經實現了從服務器發送到客戶自己的心跳所以當連接停止工作,它通常會注意到。默認情況下,它將嘗試重新連接,但是如果該重新連接不能立即工作,那麼套接字可能會在重新嘗試進一步重新連接時保持斷開連接狀態。

+0

如果我只有套接字ID而不是套接字對象,該怎麼辦? – SoftTimur

+0

@SoftTimur - 'socket.id'是服務器端的東西,但是你的代碼是客戶端的。我很困惑。您將需要獲得客戶端套接字對象來使用此標誌。如果你想得到更多的幫助,將不得不展示更多的代碼。我回答了你問的具體問題。你現在要問的是別的。如果你有一個其他客戶端的'socket.id',並且你想知道客戶端是否連接,這是一個完全不同的問題,你應該開始一個新的問題,並且完全解釋你想要做什麼,包括顯示所有相關的代碼。 – jfriend00

+0

我最初的問題是** ** id **,它確實來自服務器端。我並不是說我們不應該讓服務器檢查連接狀態。當我有我的電腦時,我會顯示更多的代碼。 – SoftTimur

1

我建議每隔30秒發送一次廣播,這樣你就不會失去連接到你的套接字。

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

我不是想避免斷開連接(我可能自己關閉連接),我只是想檢查一個id是否仍然連接。 – SoftTimur

+0

如果它不是,您將收到一個錯誤,這樣你就會知道。 – Nicolas

+0

很奇怪,沒有直接的方法來實時檢查... – SoftTimur

相關問題