我尝试与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);
当我使用计算机或其他与我的路由器连接的计算机进行测试时,它运行良好。但是,通过Internet访问的其他客户端无法建立连接。当然,他们使用公共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服务器。这个问题让我很困惑。
答案 0 :(得分:2)
使用IPv4坐在路由器后面导致将实际流量路由到正确方向(路由器后面的计算机)的问题。
您需要将路由器设置中的端口80转发到您的计算机IP。此外,我建议在您的计算机中设置路由器设置首选IP,因此重启后很可能不会更改本地IP地址(否则可能会发生)。
在这些更改之后,您甚至可以尝试使用您自己的计算机上的公共IP进行连接,如果它可以正常工作 - 那么它应该可以在外部计算机上运行。
另外,检查防火墙设置以确保它不会阻止任何到端口80的外部流量。
答案 1 :(得分:1)
您的问题称为NAT:http://en.wikipedia.org/wiki/Network_address_translation
当连接来自网络外部(即,违反公共IP)时,路由器不知道谁将接收该连接。想象一下,有3台PC和2台智能手机连接到您的路由器,哪一台将“回答”?那么,你需要做的就是告诉路由器:“亲爱的路由器,当我的朋友尝试连接端口80时,将它们重定向到设备192.168.1.37和端口80(例如)”。 如果您不想一次又一次地重新配置路由器以更新192.168.1.37(因为DHCP随机IP分配),请告诉您的路由器始终为您的PC分配相同的IP(静态IP)。
因此,为您的PC配置“静态IP”,并为端口80创建端口转发规则,以将流量重定向到您的服务器。您可以搜索“服务器后面的路由器配置”以获取更多详细信息,有数千个教程。