我安装了一个安装了Node.js的Windows EC2实例,以及ws websocket npm包。我的安全组为端口8080设置了自定义TCP连接,以允许所有连接。
我只是想从浏览器连接到它,但不能。我已经尝试了所有的东西,搜遍了SO和整个互联网,而且我的智慧结束了......请帮忙!
服务器上运行的节点脚本:
console.log("init started");
var WebSocket = require("ws");
var server = new WebSocket.Server({
"host" : "private IP of instance", // also tried public IP, but it throws an error
"port" : 8080
});
server.on("connection", function (client){
console.log("client connection open");
client.on("message", function (data){
console.log("client message received");
});
});
server.on("listening", function (){
console.log("server listening");
});
server.on("error", function (e){
console.log("server error", e);
});
console.log("init done");
当我从命令行运行上面的代码时,我得到3个日志:“init started”,“init done”和“server listening”(正如我所料)。但是,当我从一个简单的HTML页面运行下面的代码时,在Firefox中它告诉我“Firefox无法在ws://公共IP实例:8080 /上建立与服务器的连接”。而且我在服务器上没有更多日志......
var sock = new WebSocket("ws://public IP of instance:8080/");
sock.onopen = function (){
sock.send("test");
};
我确定这一定是我的EC2实例配置方式的问题,但我只是不知道问题是什么 - 我检查并重新检查了我的入站规则 - 端口8080已打开所有TCP流量!我错过了什么?
注意:我尝试在两个脚本中使用“localhost”作为主机,并在服务器本身上运行我的测试HTML页面,一切正常。服务器脚本按预期打印“客户端连接打开”和“收到客户端消息”。
编辑以添加在服务器脚本中指定实例的公共IP地址时收到的错误消息:
{ Error: listen EADDRNOTAVAIL PUBLICIP:8080
at Object._errnoException (util.js:1022:11)
at _exceptionWithHostPort (util.js:1044:20)
at Server.setupListenHandle [as _listen2] (net.js:1334:19)
at listenInCluster (net.js:1392:12)
at doListen (net.js:1501:7)
at _combinedTickCallback (internal/process/next_tick.js:141:11)
at process._tickCallback (internal/process/next_tick.js:180:9)
at Function.Module.runMain (module.js:686:11)
at startup (bootstrap_node.js:187:16)
at bootstrap_node.js:608:3
code: 'EADDRNOTAVAIL',
errno: 'EADDRNOTAVAIL',
syscall: 'listen',
address: 'PUBLICIP',
port: 8080 }
答案 0 :(得分:0)
对不起,我不知道怎么做,因为我发誓我三重检查它,但我的公共IP地址错了。
有时我讨厌自己o_O
注意:这篇文章很好地解释了公共和私人地址之间的关系:https://stackoverflow.com/a/34712279/859833