2015-07-21 186 views
0

編輯:我通過網絡套接字將數據從應用程序A發送到應用程序B,其中A是其他應用程序的路由器應用程序,B是我的網路應用程式當B收到數據時,它應該將其發送給任何查看其主頁的客戶端,也通過web套接字。但是,由於roter應用程序和主頁客戶端連接到同一個web套接字服務器,我不知道哪些連接是查看主頁的客戶端,以及哪些連接是其他東西,比如我的路由器。只有主頁客戶端才能接收數據。NodeJS和網絡套接字:檢查套接字來源是否與網絡套接字服務器相同

我基本上想要將從我的路由器收到的日誌數據實時傳遞到我的主頁,以便我可以查看它。

========

我有一個明確的應用程序,服務器簡單的HTML頁面。它運行此腳本:

var host = window.document.location.host.replace(/:.*/, ''); 
var ws = new WebSocket('ws://' + host + ':5000'); 
ws.onmessage = function (event) { 
    console.log(JSON.parse(event.data)); 
}; 

在後端的NodeJS,我有一個簡單ws服務器上運行,監聽連接:

var WebSocketServer = require("ws").Server; 

module.exports.init = function(server) { 
    var wss = new WebSocketServer({ server: server }); 
    wss.on('connection', function (ws) { 
    ... 
    }); 
}; 

我得到,此刻,2個不同地點連接。

  1. 我運行的一個路由器應用正在發送此Web應用日誌消息。
  2. 此Web應用程序正在提供的HTML頁面。

我想從路由器應用程序的數據管道到我的html頁面,但要做到這一點,我需要知道我需要哪些連接管道數據。理論上我可以有很多聯繫,但是至少在現在,只有其中的一個應該在接收後傳遞數據。

我想我可以將Web套接字連接的起源與Web套接字服務器運行的Web服務器的域進行比較。

我可以得到這樣的連接的起源:ws.upgradeReq.headers.origin。這將返回例如:localhost:5000。但我不知道我的網絡套接字服務器運行的域名。我試圖谷歌,它似乎要獲得域名,我需要從http請求中獲取它。我正在尋找的東西只是給了我名字,而不必等待http請求。

我試過os.hostname(),但它不會給我我需要的結果。 我也試過server.address(),其中servervar server = require("http").createServer(app);,但是這給了我這個:{ address: '::', family: 'IPv6', port: 5000 }

是不是隻有一種方法來獲得主機和端口?我能以某種方式使用上面的address部分獲取主機名嗎?

網絡應用程序可能會在Heroku上運行。

+0

我不是在追蹤你想要做的事情。我認爲你需要備份並描述高層次的問題,而不是你想要追求的解決方案。我得到你有一個nodejs服務器和一個假設服務於網頁的路由器。我知道你在那個nodejs進程中有一個webSocketServer,可能是在不同的端口上。我不明白你想要發送什麼數據。數據來自哪裏,你要把它發送到哪裏? – jfriend00

+0

我加了編輯,試圖澄清。 – ptf

回答

1

根據您最近的評論,這聽起來像每個連接webSocket的瀏覽器客戶端都應該告訴服務器它正在查看哪個網頁,並且服務器應該記錄每個活動連接的網頁。

在socket.io(構建於webSockets之上)中,您只需連接到/homepage命名空間,然後該服務器就可以向連接到該命名空間的所有套接字廣播。當然,您可以使用普通的webSocket自己實現這種類型的功能。

然後,你的服務器將不僅有一個連接套接字的列表,但也可以知道他們都來自哪個頁面。這將允許您根據當前頁面進行廣播。您的服務器到服務器的webSocket不會發送消息,表明它來自主頁,因此它不會被標記爲這樣,您可以避免發送到它。

您可能會發現socket.io更易於使用。除了客戶端和服務器上的命名空間之外,它還使您可以自動從瀏覽器重新連接,更簡單的消息傳遞系統,服務器端廣播到namsepaces等等。

+0

謝謝,這解決了這個問題。我有點懊惱,我沒有想到這個蝙蝠的直線,我做得這麼複雜。命名空間確實很好,但如果使用socket.io,我必須在任何地方使用它。我試着一起使用ws和io,但他們沒有連接。也許我只是在世界各地切換ws爲io。 – ptf