允许公共IP通过WebSockets进行连接

7

我尝试使用nodejs ws (einaros)创建聊天室,这是我的代码:

服务器端:

var WebSocketServer = require('ws').Server;
var wss = new WebSocketServer({ port: 80 });
wss.on('connection', function(ws) {
    console.log('connecting count:' + wss.clients.length);
});

客户端:

var hostname = location.hostname;
var port = 80;
var url = 'ws://'+hostname+':'+port+'/';
window.WebSocket = window.WebSocket || window.MozWebSocket;
var w = new WebSocket(url);

当我在我的电脑或一些使用我的路由器连接的其他计算机上进行测试时,一切正常。但是通过互联网访问的其他客户端无法建立连接。当然,他们使用的是公共IP,如218.xxx.xxx.xxx,而不是192.168.xxx.xxx。
我想知道如何解决这个问题。
谢谢你的回答。但是,这可能不是NAT问题。例如,我的公共IP是218.100.50.50,我的私有IP是192.168.1.1。当一个连接来自我的网络外部并访问218.100.50.50:80时,路由器会将其重定向到192.168.1.1:80。可以通过这种方式访问一个网页,但仍无法连接到我的websocket服务器。这个问题真的让我很困惑。
2个回答

4
坐在IPv4路由器后面会导致将实际流量路由到正确的方向(路由器后面的计算机)出现问题。
您需要在路由器设置中转发端口80到您的计算机IP。此外,我建议在路由器设置中为您的计算机设置首选IP,这样在重新启动后更有可能不更改本地IP地址(否则可能会发生)。
在进行这些更改后,您甚至可以尝试使用自己计算机的公共IP连接,如果它可以正常工作-那么它应该可以从外部计算机中工作。另外,请检查防火墙设置以确保不会阻止任何外部流量流入端口80。

1
你的问题被称为NAT:http://en.wikipedia.org/wiki/Network_address_translation 当连接来自于你网络外部(也就是对着你的公网IP),路由器不知道谁会接收到这个连接。假设有3台电脑和2部智能手机连接到你的路由器,哪一台会“回答”呢?那么,你需要告诉路由器:“亲爱的路由器,当我的朋友们尝试连接80端口时,请将他们重定向到设备192.168.1.37和80端口(例如)”。
如果你不想一遍又一遍地重新配置你的路由器以更新192.168.1.37(因为DHCP随机IP分配),那么告诉你的路由器始终为你的PC分配相同的IP(静态IP)。
因此,为你的PC配置一个“静态IP”,并创建一个端口转发规则,将流量重定向到你的服务器。你可以搜索“路由器后面的服务器配置”以获取更多详细信息,有成千上万的教程。

谢谢你的回答。然而,当我设置NAT时,它仍然不起作用。例如,我的公共IP是218.100.50.50,我的私有IP是192.168.1.1。当一个连接来自我的网络之外并访问218.100.50.50:80时,路由器将把它重定向到192.168.1.1:80。这样可以访问一个网页,但仍然无法连接到我的Websocket服务器。这个问题真的让我很困惑。 - Nagi
嗨Nagi,你找到任何解决方案了吗?我也卡在同样的问题上了。 - Achal Urankar

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接