如何在 aws EC2 中设置 Sockect.io 服务器,然后远程连接到服务器?

时间:2020-12-22 15:45:29

标签: amazon-web-services sockets amazon-ec2 socket.io

早上好。 我使用 Socket.io 创建了一个简单的聊天服务器。在下一个屏幕中,这将是客户端界面,您可以看到一些输入

enter image description here

在本地主机中,在我的电脑上工作正常。以下是来自服务器的日志消息:

enter image description here

我使用 ubuntu 将服务器上传到 EC2 实例。它工作正常,以同样的方式

enter image description here

来自 EC2 服务器的日志

enter image description here

主要问题是当我尝试从我的计算机连接到 EC2 中的 Socket.io 服务器时。我从计算机中的客户端文件中收到此错误:

<块引用>

socket.io.js:3888 获取 https://mydomain:80/socket.io/?EIO=4&transport=polling&t=NQB59WG

这是我的服务器代码:

const path = require("path");
const express = require("express");
const socketio = require("socket.io");
const app = express();



app.set('port', 3000);

//static files

app.use(express.static(path.join(__dirname, "public")));

//start the server
const server = app.listen(app.get('port'), () => {

    console.log("server on port", app.get('port'));
});

const io = socketio(server);

//websockects

io.on('connection', (socket) => {

    console.log("new connection  " + socket.id);

    socket.on('chat:message', (data) => {
        console.log(data);

        io.sockets.emit("chat:server", data);

    });

    socket.on('chat:typing', (data) => {
        console.log(data);

        socket.broadcast.emit("chat:typing", data);

    });
});

这是我的客户端代码:

const socket = io("https://domain:80");

//dom elements
let message = document.getElementById("message");
let username = document.getElementById("username");
let btn = document.getElementById("button");
let output = document.getElementById("output");
let actions = document.getElementById("actions");


btn.addEventListener('click', function() {
    console.log({
        username: username.value,
        message: message.value
    });

    socket.emit("chat:message", {
        username: username.value,
        message: message.value
    });
});

message.addEventListener('keypress', function() {
    socket.emit("chat:typing", username.value);
});


socket.on("chat:server", function(data) {
    console.log(data);
    actions.innerHTML = "";
    output.innerHTML += "<p><strong>" + data.username + "</strong>: " + data.message + " </p>";

});


socket.on("chat:typing", function(data) {
    console.log(data);
    actions.innerHTML = "<p><strong>" + data + "</strong> esta escribiendo </p>";

});

这里是端口的实例入站规则:

enter image description here

当我尝试从我的计算机连接到 EC2 实例时,我尝试了多种连接方式,如下所示:

const socket = io("https://url.org:80");

const socket = io("https://url.org");

const socket = io("https://ipaddres:80");

const socket = io("https://ipaddres");

const socket = io("ec2-xxxx.compute-1.amazonaws.com");

const socket = io("ec2-xxxx.compute-1.amazonaws.com:80");

没有任何效果,有帮助吗?

1 个答案:

答案 0 :(得分:0)

就我而言,解决方案是做两件事:

  1. 我使用没有端口的域名

const socket = io("https://url.org");

  1. EC2 实例与 nginx 配合使用,我修改了标头以添加此属性:

访问控制允许来源:*

它奏效了