2012-05-31 77 views
0
房間

我想實現一個應用程序IM使用快車3創建私有信息和socket.ioSocket.io兩個客戶端添加到

當客戶端連接與客戶的用戶ID的房間會自動創建並加入。這主要是爲了通知和那種東西。現在即時通訊也試圖讓這項工作也適用於私人聊天。當用戶點擊發送按鈕時,郵件會與發件人的用戶標識(來自會話用戶標識)以及從隱藏字段或屬性中獲取的所有者用戶標識一起發送的元素。發件人加入擁有所有者userid命名空間的房間。問題在於,當發件人轉到另一個頁面或刷新瀏覽器時,他會從房間中連接,並且不會收到來自所有者的任何其他消息。他必須發送一條新消息重新加入主人房間。現在,我如何percist與業主房間的連接?還是我這樣做都錯了?有沒有更好的或標準的方法來實現這一目標?

SERVER:

io.on('connection', function (socket) { 
    var sh = socket.handshake; 

    socket.join(sh.session.userid); 

    socket.on('chat', function (data) { 
     if (data.user) { 
      socket.join(data.owner); 
     } 
     io.sockets.in(data.owner).emit('chat', 
      {user: sh.session.user, message: data.message}); 
    }); 
}); 

客戶:

var socket = io.connect('https://localhost/'); 

$('#send_message').click(function (e) { 
    socket.emit('chat',{message: $('.message').val(), 
     user:$('#user'), owner:$('#owner')} //Get this from hidden fields in chat form); 
    e.preventDefault(); 
}); 

socket.on('chat', function (data) { 
    $('ol').prepend('<li>' + data.user + '<br />' + data.message + '</li>'); 
}); 
+0

默認情況下,客戶端不重新連接到服務器嗎?在網站上登錄並刷新網站有什麼不同?兩次執行相同的代碼,對吧? – Amberlamps

回答

2

權。因爲當您重新加載頁面時,服務器會收到「客戶端斷開連接」消息並取消訂閱套接字。客戶需要重新發出「聊天」消息(擁有相同的所有者ID)才能重新獲得私人Feed。

一種方法是讓客戶端將所有者ID保存在Cookie中,並在每次加載頁面時調用它。或者,您可以讓服務器使用會話cookie(http://www.senchalabs.org/connect/session.html)存儲和調用此信息,實際上,它與第一個選項非常相似。

+0

好吧,我更改爲socket.join(sh.session.rooms);並設置會話數據rooms = data.owner。然後,您可以將用戶連接的所有房間添加到對象或其他內容中。謝謝 – georgesamper