繁体   English   中英

Express 和 Websocket 在同一个文件的同一个端口上运行

[英]Express and Websocket to run on the same port on the same file

我正在运行两个应用程序,它们使用 websocket 相互发送实时消息,还使用 express.js 生成随机链接,现在我将服务器与两个反应应用程序托管到我的 vps 主机,并希望使 websocket 连接安全( wss://) 但我意识到我也必须在同一个端口上获得快速服务器,所以 ssl/tsl 对两者都有效——那么我该怎么做呢?

这是我的完整代码,都在同一个文件中:

const webSocketServerPort = 8000;

const webSocketServer = require('websocket').server;

const http = require('http');

const server = http.createServer(); server.listen(webSocketServerPort); console.log('Listening on port 8000');

const wsServer = new webSocketServer({ httpServer: server })

//GEERTOOOO

const express = require('express'); const cors = require('cors'); const fs = require('fs'); const app = express();

app.use(cors({ origin: '*' }));

app.get('/', (req, res) => { // Generate a random 6-character string const linkId = Math.random().toString(36).substr(2, 6);

// Save the link in the lex.json file fs.readFile('lex.json', (err, data) => { if (err) { console.error(err); res.status(500).send('Error generating link'); return; }

const links = JSON.parse(data);
links[linkId] = {
  destination: 'http://localhost:4000/',
  expires: Date.now() + 1000 * 60 * 5  // expires in 5 minutes
};
fs.writeFile('lex.json', JSON.stringify(links), (err) => {
  if (err) {
    console.error(err);
    res.status(500).send('Error generating link');
    return;
  }

  // Send the link back to the client
  res.send(`http://localhost:3000/${linkId}`);
});

}); });

app.get('/:linkId', (req, res) => {
 fs.readFile('lex.json', (err, data) => {
if (err) { console.error(err); res.status(500).send('Error retrieving link'); 
return;
}

const links = JSON.parse(data);
const link = links[req.params.linkId];
if (!link) {
  res.status(404).send('Link not found');
  return;
}

// Check if the link has expired
if (link.expires < Date.now()) {
  res.status(410).send('Link has expired');
  return;
}

// Redirect to the destination
res.redirect(link.destination);
}); });

app.listen(3000, () => { console.log('Server listening on port 3000'); });

//GEERTOOOO

const clients = {};

const getUniqueID = () => { const s4 = () => Math.floor((1 + Math.random()) * 0x10000).toString(16).substring(1);

return s4() + s4() + '-' + s4(); }

wsServer.on('request', (request) => { var userID = getUniqueID();

const connection = request.accept(null, request.origin); clients[userID] = connection;

connection.on('message', (message) => {
if (message.type === 'utf8') {

  for(var key in clients) {
    if (clients[key] !== clients[userID]) {
      clients[key].sendUTF(message.utf8Data);
      console.log(`Sent Message to: ${clients[key]}`);
    }
  }
}
}) })

注意:express 服务器在端口 3000 上,而 websocket 服务器在端口 8000 上运行。

我尝试过将端口更改为相同的东西,但在尝试使用 websocket 服务器接收消息时出现错误。

所有这一切的目的只是为了使 WEBSOCKET 连接和快速连接安全,以便我的应用程序(使用 letsencrypt ssl)可以连接到服务器

不可能创建两个单独的服务器实例,它们都在同一个端口上侦听。 但是,特别是对于 webSocket,您可以在 Express 和 webSocket 服务器代码之间共享一个服务器实例。 这是可能的,因为 webSocket 连接总是以 http 请求开始(因此可以使用您的 Express http 服务器侦听它。并且,因为发起 webSocket 的这些 http 请求都包含标识标头,它们可以从常规 1822244 请求中分离出来对于 Express,通过查看标题。webSocket 服务器代码已经知道如何为您执行此操作。

为此,首先捕获 Express 服务器实例:

const server = app.listen(3000, () => { console.log('Server listening on port 3000'); });

然后,在创建 webSocket 服务器时使用该server实例。

const wsServer = new webSocketServer({ httpServer: server });

然后,删除此代码,因为您不想为 webSocket 服务器创建另一个 http 服务器实例:

const server = http.createServer(); 
server.listen(webSocketServerPort); 
console.log('Listening on port 8000');

您通常不能在同一个端口上侦听两个不同的服务(有关此的更多信息,请参阅此问题)。

您接下来可以做什么有几个选项。 一种选择是在受保护的端口上运行一项服务,该服务接受对您的其他两个服务的请求,然后将它们重定向到这些端口(充当代理)。 另一种选择是保护两个端口,如果目前这太困难,可能会通过不同的方法。 第三种选择是将所有不同的端点移动到一个服务中,尽管从架构的角度来看这可能不明智。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM