Socket.io 无法使用 nodejs 在 aws 上工作

Posted

技术标签:

【中文标题】Socket.io 无法使用 nodejs 在 aws 上工作【英文标题】:Socket.io not working on aws with nodejs 【发布时间】:2017-09-12 18:50:26 【问题描述】:

我正在尝试连接到 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');
            );

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

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

 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


 ); 

 )

当我运行“node server.js”时,它显示“DB CONNECTED”但不是“SOCKET CONNECTED”。 带有 localhost:8080 的代码(在我的本地机器上而不是在 aws 上)可以正常工作。在 aws Ec2 上有什么特别需要做的吗?任何建议将不胜感激。在此先感谢

【问题讨论】:

【参考方案1】:

您可以检查两件事。

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

    您应该检查 linux(aws) 防火墙上是否打开了端口 3000。为了让你可以运行:

    sudo iptables -I INPUT -p tcp --dport 3000 -j ACCEPT
    

让我们仔细看看上面的命令。我们知道命令中的 iptables 是什么,是二进制文件还是程序本身,现在让我们看看其他选项。

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

INPUT 告诉 iptables 命令您希望将规则输入到哪个链中。

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

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

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

【讨论】:

我认为问题在于打开端口。解决了!谢谢! 这种不安全吗?当我不使用端口时,我应该关闭它吗?【参考方案2】:

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

【讨论】:

以上是关于Socket.io 无法使用 nodejs 在 aws 上工作的主要内容,如果未能解决你的问题,请参考以下文章

Laravel与Socket.io Nodejs共享会话

带有 socket.io 的 WebRTC/nodejs 中的屏幕共享问题

使用 peerjs socket.io nodeJS 进行视频通话有时才有效

Nodejs & Socket.io 可以支持多少用户?

Socket.io 无法在 Android 9(API 级别 28)上运行

在nodejs中使用socket.io和net socket