Linked Questions

Popular Questions

Web socket doesn't open on other machines

Asked by At

Web soket connection error

I've got a problem with my server. It uses express and express-ws for web sockets. The problem is that this server works fine on the local host. But when i run it with the help of ssh (see localhost.run) and access the site by the given link from another computer (through Chrome), the web socket doesn't open and the next error shows up in the console

main.js:12 WebSocket connection to 'ws://localhost:3000/' failed: Error in connection establishment: net::ERR_CONNECTION_REFUSED

even though i added cert and key to the server connection. P.S. The site loads too, it's only that the socket doesn't work.


here is the server.js code:

"use strict";
const fs = require("fs");

const credentials = {
  key: fs.readFileSync("./key.pem"),
  cert: fs.readFileSync("./cert.pem")
};

const express = require("express");
const app = express();
const bodyParser = require("body-parser");
const https = require("https");

const PORT = process.env.PORT || 3000;

app.use(express.static(__dirname + "/public/Messenger"));
app.use(express.static(__dirname + "/public/Login"));
app.use(express.json());
app.use(bodyParser.json());
app.use(bodyParser.urlencoded({ extended: true }));

const server = new https.createServer(credentials);

const expressWs = require("express-ws")(app, server);//if i take the 
//second argument (server) away, it works fine on localhost:3000, but 
//with this it fires the error:

//WebSocket connection to 'ws://localhost:3000/' failed: Connection 
//closed before receiving a handshake response

const routes = require("./MVC/Router/router.js"); //importing route
routes(app);

app.listen(PORT, () => {
  console.log("listening on port " + PORT);
});

here is the router.js:

   "use strict";
module.exports = function(app) {
  const database = require("../Controller/controller.js");

  // database Routes
  app.route("/").get(database.loadPage);

  app.route("/login").get(database.loginPageLoad);

  app
    .route("/signIn")
    .get(database.signInPageLoad)
    .post(database.signIn);

  app
    .route("/submitLogin")
    .post(database.loginSubmit)
    .get(database.showUsers);

  app.ws("/", database.sendmsg);
};

which redirects the processing flow to the next part of controller.js:

const CLIENTS = [];
let counter = 0;

exports.sendmsg = (ws, req) => {
  console.log(cache.get("lorem"));
  ws.on("message", msg => {
    if (msg === "connected") {
      console.log("connected");
      CLIENTS.push([ws, counter]);
      ws.send(JSON.stringify({ counter }));
      counter++;
    } else if (JSON.parse(msg).msg && JSON.parse(msg).ID) {
      CLIENTS.forEach(box => {
        if (box[1] === msg.ID) {
          console.log(`user ${box[1]} is closed`);
          box.push("closed");
          box[0].close();
        } else {
          return;
        }
      });
    } else {
      sendAll(msg);
    }
    ws.on("close", () => {
      console.log("disconnected");
      ws.close();
    });
  });
};

function sendAll(message) {
  for (let i = 0; i < CLIENTS.length; i++) {
    if (CLIENTS[i][0].readyState === 1) {
      CLIENTS[i][0].send(message);
    }
  }
}

The last piece of code is just what it does on the server, don't care of it too much. The problem is that the web socket doesn't get open when i enter the link from another computer. How can i solve it?

Related Questions