Socket.io没有使用nodejs在aws上工作

时间:2017-04-17 06:51:38

标签: node.js amazon-web-services amazon-ec2 socket.io socket.io-1.0

我正在尝试连接到aws ec2实例上的套接字。出于某种原因,我无法这样做。我的客户端代码是:

var socket = io.connect('http://ec2-MY-IP.us-west-2.compute.amazonaws.com:3000');
            console.log(socket);
                    socket.on('connect', function(){
                      alert(socket.id); // 'G5p5...
                    });
   socket.on('connect_error', function(){
                console.log('Connection Failed');
            });

我总是得到"连接失败"在浏览器控制台中

我已经从安全组的Inbound部分打开了端口,当我使用时:

 telnet ec2-MY-IP.us-west-2.compute.amazonaws.com 3000

它给我输出

 Trying ...
 Connected to ec2-MY-IP.us-west-2.compute.amazonaws.com.
 Escape character is '^]'.

我的服务器端代码在这里:

 const express = require('express');
 const bodyParser= require('body-parser');
 const app = express();
 var http = require('http').Server(app);
var io = require('socket.io')(http);
http.listen(3000, () => {
console.log('listening on 3000');
  });
    MongoClient.connect('mongodb://ec2-MY-IP.us-west-2.compute.amazonaws.com:27017/userlogsdemo', (err, database) => {
  if (err) return console.log(err)
 db = database;
console.log("DB CONNECTED")
io.on('connection', function (socket) {
    console.log("SOCKET CONNECTED")
    socketobj = socket
     socket.on('reloadtickets', function (data) {
    connectedusers.forEach(function(v){
            if(v.connecteduserid == data.target){ 
                setTimeout(function () {
                   io.emit('reloadticketsok',data );
                }, 100)


            }
        });
});
 // WHEN SOMEONE IS DISCONNECTED


 }); 

 })

当我运行"节点server.js"它说" DB CONNECTED"但不是" SOCKET CONNECTED"。 使用localhost的代码:8080(在我的本地机器上没有在aws上)正常工作。是否有任何特殊要求在aws Ec2上完成。任何建议将不胜感激。提前致谢

2 个答案:

答案 0 :(得分:1)

您应该打开运行它的套接字的端口 让您使用端口8890
sudo iptables -I INPUT -p tcp --dport 8890 -j ACCEPT

答案 1 :(得分:0)

您可以检查两件事。

  1. 您如何配置安全组。请验证一次: 您应该选择“自定义TCP规则”'端口范围3000(根据您的代码),您可以在任何地方选择(用于测试)。

  2. 您应该检查是否在linux(aws)防火墙上打开了端口3000。允许您运行:

    sudo iptables -I INPUT -p tcp --dport 3000 -j ACCEPT
    
  3. 让我们仔细看看上面的命令。我们知道iptables在命令中是什么,那就是二进制文件或程序本身,现在让我们看看其他选项。

    -I代表插入。这会将规则插入链的顶部。您还可以使用-A进行追加,这会将新规则放在链的末尾。

    INPUT告诉iptables命令您希望输入规则的链。

    -p tcp告诉规则只使用TCP协议匹配数据包。

    - dport 80表示要匹配前往80端口或http的流量。 --dport代表目的港。

    -j代表JUMP跳转到指定的动作或链。在我们的例子中,我们使用-j ACCEPT,因此它将跳转到ACCEPT操作并允许流量通过。