NodeJS 通过HTTP和HTTPS使用套接字. IO+节点. JS

llmtgqce  于 2023-01-25  发布在  Node.js
关注(0)|答案(1)|浏览(131)

我有一个带有Socket.IO的Node.JS服务器,它运行在带有Express的HTTP上。有了这个,所有用户都通过一个地址连接,例如https://socket.example.com:443
问题是,同一本地网络上的虚拟机必须采用更长的路径才能到达Socket.IO服务器,即使它们位于同一网络上。
是否可以同时使用HTTP和HTTP运行同一个NodeJS+Socket.IO应用程序?
通过这种方式,同一网络上的应用程序可以仅使用http +计算机的IP连接到服务器(例如:http:192.168.0.1:3400),从而提高通信速度(并降低Google云的成本)。
我这样运行应用程序。

app = require('express')(),
serverSSL = require('https').Server(credentials, app);

io = require('socket.io')(serverSSL, {
    cors: {
        origin: "*",
        methods: ["GET", "POST"]
    }
});

或者我必须放置一个nginx代理通过HTTP连接到服务器,并保持它在主服务器上运行HTTP?
--编辑2022年1月18日--
我的计划是使用PM2来运行代码,并且由于socket.io在启动时需要HTTP或HTTPS服务器,所以我认为使用HTTP服务器和负载平衡器与NGINX来处理HTTPS会更好。
https://socket.io/docs/v4/pm2/
--编辑2022年1月19日--
解决方案:https://github.com/socketio/socket.io/discussions/4600

pgpifvop

pgpifvop1#

  • 问题是你不能从nodejs的同一个端口运行http和https,但是你可以创建两个不同的服务器,如下所示
const http = require('http');
    const https = require('https');
    const { Server } = require('socket.io');
    
    //httpServer
    const httpServer = http.createServer((req, res) => {
      res.writeHead(200);
      res.end('http server');
    });
    
    //httpserver
    const httpsServer = https.createServer({
      key: fs.readFileSync('path/to/key.pem'),
      cert: fs.readFileSync('path/to/cert.pem')
    }, (req, res) => {
      res.writeHead(200);
      res.end('https server');
    });

    //Initializing our socket.io Server
    const io = new Server({
      cors: {
        "Access-Control-Allow-Origin": "*",
        methods: ["GET", "POST", "OPTIONS"]
      },
      maxHttpBufferSize:1e8,
      pingTimeout:60000
    });

    
    io.attach(httpServer)
    io.attach(httpsServer)
    httpServer.listen(3000)
    httpServer.listen(4000)
  • .attach()在旧版本中可以正常工作,但建议使用.listen()
  • 代替传统的http和https服务器,可以方便地使用express http和https服务器
  • 连接的http和https服务器将侦听相同的事件
  • 因此,您需要的客户端可以同时使用http和https服务器

相关问题