我正在尝试连接到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上完成。任何建议将不胜感激。提前致谢
答案 0 :(得分:1)
您应该打开运行它的套接字的端口
让您使用端口8890
sudo iptables -I INPUT -p tcp --dport 8890 -j ACCEPT
答案 1 :(得分:0)
您可以检查两件事。
您如何配置安全组。请验证一次: 您应该选择“自定义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操作并允许流量通过。