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 上工作的主要内容,如果未能解决你的问题,请参考以下文章
带有 socket.io 的 WebRTC/nodejs 中的屏幕共享问题
使用 peerjs socket.io nodeJS 进行视频通话有时才有效