2016-09-27 125 views
0

我剛開始工作節點js.I一直在嘗試使用節點js創建聊天應用程序。其中一個用戶可以通過多個設備或瀏覽器登錄。如果我沒有錯,並且據我瞭解每個瀏覽器與不同的端口地址通信,因爲套接字連接是由IP地址和端口地址定義的,因此當同一用戶從兩個不同的瀏覽器登錄時,服務器會創建兩個不同的套接字Id.Now如果用戶已通過檢查發送到套接字信息的參數連接。那麼如果用戶已連接或套接字已爲用戶設置,那麼我創建連接以將套接字標識更改爲之前套接字標識爲。節點js中的套接字連接

io.on('connection', function(socket){ 
socket.id = k; 
}); 

其中k是先前連接的同一用戶的套接字ID查閱

當任何其他客戶端發出消息,那麼當前用戶是插座ID替換和僅一個瀏覽器獲得的消息或二者獲取消息。服務器的連接是爲瀏覽器還是單個瀏覽器設置的。請幫助我。我仍然不清楚在客戶端和服務器之間如何建立套接字連接。 如果我錯誤地做了任何假設,請改善或者我如何解決下面的情況。 在此先感謝

回答

2

如果我正確理解你的問題,讓我嘗試用我的方式解釋。比方說你有服務器的下面的代碼:

var io = require('socket.io')(somePort); //same port for the client to connect, e.g. 3000 
    io.on('connection', function(socket){ 
    // in here you should define any actions on your primary socket 
    // for example: 
     socket.on("hello", function(dataUserSendsWithTopicHello){// overly long variable name to show my point! :) 
     // do something with hello data 
     }); 

    // this will go to anyone who is connected and has a handler like above for "hello" 
     socket.emit("hello", "hello to all who listen to hello topic"); 
    }); 

相應的客戶端將是:如果你想只回復一個用戶

var socket = io.connect('ip:port'); // e.g. localhost:3000 - same ip and port as above 

    socket.on('hello', function(serverResponseToHello){ 
    // do something when server sends back something on hello 
    }); 

// send a hello to the server 
    socket.emit("hello", "Sending hello to server"); 

現在,還是一個人們可以一起看到一些消息,比如在聊天中,您可以利用socket.io的房間/名稱空間實現(http://socket.io/docs/rooms-and-namespaces/)併爲每個客戶端創建一個空間,或爲一組客戶端創建一個空間。爲此,看看這個答案:Using Socket.io with multiple clients connecting to same server

總結起來,有一個ip和一個端口。每個人都聽這個IP和端口,如果你打開三個標籤,並且你有一些像上面這樣的實現,所有標籤都會聽到「你好」。使用房間,您可以將用戶分組並隔離通信,以便只有在正確用戶和不是全部用戶之間進行通信的用戶。

祝你好運!

+0

我的問題恰恰是針對不同的瀏覽器或計算機。當用戶從多臺計算機登錄或可能是不同的瀏覽器時會發生什麼情況。 –

+0

不同的瀏覽器或不同的計算機(當你沒有房間/名稱空間的實現)將會有相同的許多選項卡。插座可以讓我們說'someIp:somePort'例如'98.45.32.21:3000',不會改變,所以,當發送「hello」的服務器會用hello(在上面的實現中)回覆所有人。 – mkaran

+0

如果您希望用戶從兩個不同的瀏覽器登錄並看到相同的消息 - 但只有他的消息,那麼您應該將該用戶與正確的房間相關聯,以便當他從另一個瀏覽器連接並且您知道它是用戶sagar',你會和他一起進入正確的房間。 – mkaran

0

我也是相當新的套接字(和JS),我試圖做一個聊天應用程序,但有點不同。

據我瞭解,該消息將只在一個瀏覽器上接收。更好的設計是讓用戶通過多個瀏覽器/設備連接。您可以維護用戶連接的所有套接字列表(如果您需要的話)。

如果您需要一對一聊天,也許您可​​以編寫一些代碼,其中兩個用戶連接的所有套接字都加入一個房間。

socket.room = roomname 
socket.join(roomname) 

然後你只是把消息廣播到那個房間。這樣,兩個用戶都連接到的每個套接字都將獲得該消息。

socket.to(socket.room).broadcast.emit("message", message); 

(我保存在插座上的房間信息,不知道如果這是一個很好的設計)

希望這有助於!