'socketio, client can connect to server if hosted locally, but returns error when trying to connect to server hosted on seperate vserver

I am trying to make a simple server with socket.io and express and connect to it through a website. when i followed a tutorial on socketio with localhost, everything worked fine, but when i put the server on a vserver, and tried to connect to it, i got this error:

Failed to load resource: net::ERR_SSL_PROTOCOL_ERROR

as well as:

GET https://54.53.0.254:47185/socket.io/?EIO=4&transport=polling&t=O09jjrs net::ERR_SSL_PROTOCOL_ERROR

here is my server code:

const express = require('express');
const app = express();
const server = app.listen(47185);
const socket = require('socket.io');
const io = socket(server)
console.log('server running on port 47185');

io.sockets.on('connection', newConnection);

function newConnection(socket) {
    console.log('new connection: ' + socket.id);
    socket.on('input', inputLog)

    function inputLog(data) {
        socket.broadcast.emit('input', data);
        console.log(data);
    }
}

and here is my client code (this is all that relates to socket.io, the rest is just for the website)

var options = {
    rejectUnauthorized:false
}
var socket;
socket = io.connect('89.58.0.199:47185', options);

socket.on('input', foreignInput)

function foreignInput(data) {
    terminal_animate('\n' + data)
}

i have tried many different fixes and googled everything i can think of, and i'm just not sure what the problem is.

can anyone help me out with this issue? thanks in advance.



Solution 1:[1]

In the documentation, according to the Client Initialization part, in node.js you should provide the protocol when connecting to the server.

// the following forms are similar
const socket = io("https://server-domain.com");
const socket = io("wss://server-domain.com");
const socket = io("server-domain.com"); // only in the browser when the page is served over https (will not work in Node.js)

The first two example shows the secure https/wss as protocol, for that you need to serve the required files from the server, example in the documentation.

With http/ws as protocol it should work, but the communication will not be secure.

The Server Initialization / With Express shows an example to call .listen on the return value of createServer from the http module, with the app given as a parameter.

const express = require("express");
const { createServer } = require("http");
const { Server } = require("socket.io");

const app = express();
const httpServer = createServer(app);
const io = new Server(httpServer, { /* options */ });

io.on("connection", (socket) => {
  // ...
});

httpServer.listen(3000);

With a caution that says:

Using app.listen(3000) will not work here, as it creates a new HTTP server.

Sources

This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.

Source: Stack Overflow

Solution Source
Solution 1 Yami