2015-07-21 109 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