簡體   English   中英

如何在nodejs上與主服務器一起運行socketIO服務器

[英]How to run socketIO server together with main server on nodejs

目前,我們有一個托管在 localhost:3000 上的主服務器,但是要運行我們的 socket.io 函數,我們需要在同一台服務器上運行它。 但是,我們需要單獨運行它(npm start 單獨)。 有沒有辦法一起運行它或在同一台服務器上運行它而不會崩潰?

您不能在單獨的進程中運行 socket.io,但在與其他進程中的其他 Web 服務器相同的端口上。 操作系統不允許這樣做,因為只有一個進程可以在特定端口上擁有一個監聽服務器。 如果它們在同一個進程中,這很容易,因為 socket.io 被構建為在同一個進程中共享一個 http 服務器(內部一個偵聽服務器,流量在兩個用途之間分配)。 但是,不是來自單獨的進程。

為此,您必須在端口 3000 上使用 nginx 之類的東西,將純 Web 請求代理到其他端口上的一個服務器,例如 3001,並將 socket.io 請求代理到其他端口上的另一台服務器,例如 3002。客戶端只會處理端口 3000 和 nginx 會將流量引導到不同端口上的正確服務器。


我在想,當你說“npm start separate”時,你一定有其他問題要嘗試用該語句解決,我們可能會提供更好的方法來解決這個實際問題(如果你披露了那個實際問題要求是)同時將 socket.io 和 http 服務器保持在同一個進程中,因此不需要代理來划分兩個獨立服務器之間的流量。

例如,您可以在未啟動 socket.io 服務器的情況下啟動您的 web 服務器,然后您可以告訴您的 web 服務器進程稍后啟動 socket.io 服務器。 或者您可以在初始化時在同一個進程中同時啟動 Web 服務器和 socket.io 服務器,但是有一個臨時服務器配置會阻止傳入的 socket.io 連接,直到滿足其他一些要求。

但是,在不了解真正的需求是什么的情況下,您只是向我們提出了一個XY 問題,您在其中描述了您嘗試的解決方案,而不是需要解決的實際問題。 當我們解釋您嘗試的解決方案是錯誤的方法時,我們需要知道真正的問題是什么才能進一步提供幫助。

這是簡單的 SocketIo 服務器代碼。 它不是客戶端代碼。
你必須在 npm 下載 SocketIO。

const express = require('express');
const http = require('http');
const SocketIo = require('socket.io');

const app = express();

app.set('view engine', 'pug');
app.set('views', __dirname + '\\views');
app.use('/public', express.static(__dirname + '/public'));

app.get('/', (req, res) => res.render('home'));

const handleListen = () => console.log('Listening on http://localhost:3000');

const httpServer = http.createServer(app);
const wsServer = SocketIo(httpServer);

wsServer.on('connection', (socket) => {
  console.log('someone joined!')
  socket.on('join_room', (roomName) => {
    socket.join(roomName);
    socket.to(roomName).emit('welcome');
  });
});

httpServer.listen(3000, handleListen);

有關更多信息,請訪問官方文檔。 https://socket.io/get-started/chat

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM