【问题标题】:How to make express js and socket io listen to different ports如何让express js和socket io监听不同的端口
【发布时间】:2017-12-04 20:58:18
【问题描述】:

我的 socket io 和 Node express js 服务器现在都监听相同的端口。它托管在 AWS ElasticBeanStalk 中。它的工作很好。 现在由于安全限制,必须将套接字 io 移动到不同的端口。它是与 node js 应用程序相同的代码库的一部分。 我可以为套接字 io 监听不同的端口吗?这行得通吗?我必须在 ElasticBeanStalk 中进行哪些更改?是否需要打开新的端口或者端口有什么限制?

【问题讨论】:

  • 哪些安全限制导致您必须将 socket.io 移动到与 Web 服务器不同的端口?通常安全限制都喜欢在同一个端口上。这就是 websocket/socket.io 被设计为与 http 服务器共享端口的全部原因。
  • Socket io 仅用于事件发布。因此在我们的用例中不需要对其进行保护。我们的节点应用程序是完全安全的,它需要授权承载令牌。并且节点正在工作的端口仅向 API 管理器公开。所以socket io应该在不同的端口来绕过API Manager
  • 您当然可以在同一个 node.js 应用程序中监听 socket.io 的不同端口。对于常规 socket.io 连接(以几个轮询请求开始的默认连接),如果连接是从浏览器建立的,您可能还必须启用 CORS,以便浏览器允许连接到不同于网页。或者,您可以将 socket.io 客户端更改为立即使用不受 CORS 限制的 webSocket 启动。对于使用新端口需要对 AWS 进行哪些更改,我无能为力。
  • AFAIK 如果您通过其 express 实现使用 socket.io,它们只会绑定到同一个端口。如果你把这两个分开,你可以为socket.io选择你喜欢的任何端口,但它不会自动将JS文件传递到前端。

标签: amazon-web-services websocket socket.io amazon-elastic-beanstalk


【解决方案1】:

docs 给出了通过 Express 通过标准 Node HTTP 进行连接的示例。所以从技术上讲,您可以将它们融合在一起并在不同的端口上监听。

var exApp = require('express')();
var exServer = require('http').Server(exApp);

var ioApp = require('http').createServer(handler);
var io = require('socket.io')(ioApp);

exServer.listen(80);
ioApp.listen(81);

function handler (req, res) {
  res.writeHead(200).end({});
}

app.get('/', function (req, res) {
  res.sendfile(__dirname + '/index.html');
});

// Then whatever you want to do with `io`, and `exApp`.

如果您转到localhost:80,您将获得 Express 应用程序服务,如果您向 localhost:81 发送 socket.io 请求,它应该会触发 io.connection()

我还没有在技术上对此进行过测试,所以如果我很疯狂,请告诉我,我会进一步考虑。

【讨论】:

  • 我对elasticbean stalk中的配置变化比较感兴趣,可能在nginx中
  • 你有想过这个吗?
猜你喜欢
  • 2019-10-28
  • 2018-10-29
  • 2017-03-30
  • 2019-09-27
  • 1970-01-01
  • 2014-07-02
  • 1970-01-01
  • 1970-01-01
  • 2017-07-06
相关资源
最近更新 更多