Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/35.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript JS WebSocket赢得';t连接到运行Node.js';ws';包裹_Javascript_Node.js_Amazon Ec2_Websocket - Fatal编程技术网

Javascript JS WebSocket赢得';t连接到运行Node.js';ws';包裹

Javascript JS WebSocket赢得';t连接到运行Node.js';ws';包裹,javascript,node.js,amazon-ec2,websocket,Javascript,Node.js,Amazon Ec2,Websocket,我有一个安装了Node.js的Windows EC2实例和websocket npm包。我的安全组为端口8080设置了自定义TCP连接,以允许所有连接 我正在尝试从浏览器连接到它,但无法。我什么都试过了,到处都找遍了,整个互联网都找遍了,我真是束手无策。。。请帮忙 服务器上运行的节点脚本: console.log("init started"); var WebSocket = require("ws"); var server = new WebSocket.Server({ "h

我有一个安装了Node.js的Windows EC2实例和websocket npm包。我的安全组为端口8080设置了自定义TCP连接,以允许所有连接

我正在尝试从浏览器连接到它,但无法。我什么都试过了,到处都找遍了,整个互联网都找遍了,我真是束手无策。。。请帮忙

服务器上运行的节点脚本:

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 start”、“init done”和“server listing”(正如我所期望的那样)。然而,当我从一个简单的HTML页面运行下面的代码时,在Firefox中,它告诉我“Firefox无法在ws://public IP of instance: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 }

对不起,我不知道怎么做,因为我发誓我检查了三遍,但我的公共IP地址错了

有时候我恨我自己


注意:这篇文章很好地解释了公共地址和私有地址之间的关系:

服务器的IP是它将绑定到的(监听)。指定专用IP是无用的,因为外部传入连接无法访问该IP。找出它为公共IP提供错误的原因。如果服务器在公共IP上侦听,它应该可以工作。您也可以尝试0.0.0.0服务器IP,告诉它在所有接口上侦听。@marekful感谢您的评论-“0.0.0.0”与使用私有IP的结果相同-使用公共IP会给我一个“EADDRNOTAVAIL”错误。。。所以我研究了一下,尝试了几件没有运气的事。。。我尝试过:更改端口号(尝试了几个),使用公共DNS而不是IP,根本不指定“主机”,以及这些的几种组合。。。所有这些要么给了我“EADDRNOTAVAIL”错误,要么什么都没做(比如使用私有IP)。我还发现更多的帖子说要使用私有IP,或者有人称之为“内部IP”?我在我的实例详细信息中没有看到。。。