2011-11-27 75 views
1

當客戶端斷開 (用戶關閉瀏覽器或選項卡)時是否可以發送套接字數據? 因爲,我發現在斷開連接時的默認綁定不會接收任何輸入數據。有沒有辦法讓客戶端在套接字斷開的情況下發送服務器數據?

//on server side 
socket.on('disconnect',function(){ 
    //in other binds, it takes 'data' as an input but this does not 
}); 

我試圖使用jQuery的卸載方法 像下面

//on client side 
$(window).unload(function(){ 
    socket.emit('depart','I am leaving'); 
}); 

然而,它似乎並沒有在所有發出的卸載來解決這個問題。 (也許socket在卸載時超出範圍?) 當客戶端斷開連接時,有沒有辦法通過websocket將數據發送到服務器?

其次,有沒有什麼辦法可以將字符串數據存儲在套接字中?例如, socket.userName = userNameVar;

--update-- 這是我如何設置環境對服務器端

io.sockets.on('connection',function(socket){ 
    socket.on('depart',function(data){ 
     console.log(data); 
     console.log("user left"); 
    }); 
    socket.on('disconnect',function(){ 
     console.log("user disconnected"); 
    }); 
}); 

和下面的代碼是在客戶端。

var socket = io.connect(hostVar); 

$(window).unload(function(){ 
    socket.emit('depart','I am leaving'); 
}); 

回答

1

不能在斷開連接時發送數據的原因是因爲您斷開連接。你所問的有點類似於說:「在我掛斷電話後,我還可以和他通話?」

如果你想發出「出發」的事件,那麼你還是要捕捉它在服務器端的「連接」處理程序中:

如:

io.socket.on('connection', function(socket) { 
     socket.on('depart', function(msg) { 
      // you should get depart message here 

     }); 
}) 

你的出發事件將在連接終止之前來。斷開連接僅在服務器成功斷開連接後引發,因此它不能接收任何消息。

給它一個嘗試,並告訴我,如果這個工程:)

+0

是的,我做到了,但jQuery.unload事件將不會發送該數據...我將在更新 – user482594

+0

更多代碼嗯,你的套接字對象仍然在該階段的功能?做一個警報(socket.toString())來查看對象是否仍然存在。 –

+0

顯然,警報不會顯示出來......猜猜我的代碼在某處存在問題..我會尋找 – user482594

0

使用這個代替

$(window).on('beforeunload',()=>{ 
     socket.emit('page_unload'); 
}); 

,並在服務器端

io.socket.on('connection', function(socket) { 
     socket.on('page_unload', function(msg) { 
      // client has reloaded page or closed page 
     }); 
}) 
+0

請增加更多細節。 –

相關問題