【问题标题】:Socket.io listening on multiple ports?Socket.io 监听多个端口?
【发布时间】:2019-02-25 23:26:39
【问题描述】:

我进行了一些搜索,但找不到有关此主题的任何更新答案,因为找到的答案仅适用于旧版本的 Socket.io。

这是我的代码:

let http = require('http').Server(app);
let io = require('socket.io')(http);

http.listen(7000, '::1', function () {
    // Now listening
});

io.on('connect', function (socket) {

}

我可以添加额外的代码吗?如:

http.listen(8000, '::1', function () {
    // Now listening
});

io2.on('connect', function (socket) {

}

我希望这个单个 node.js 实例同时监听两个不同的端口。这样我就可以适当地处理两种不同类型的客户端,让它们连接到相应的套接字,然后以不同的方式处理这两个组。

如何做到这一点?

【问题讨论】:

  • 您是否考虑过在socket 中使用命名空间,即客户仍连接到特定端口但他们转到单独的命名空间?
  • @SamuelToh 对不起,我不明白

标签: node.js socket.io


【解决方案1】:

我不确定app 是什么,假设您使用的是流行的express 服务器模块。是的,可以这样做。

你可以做的是让主要的 NodeJS 进程产生 2 express servers。每个监听一个特定的端口。然后有 2 个套接字,每个套接字绑定到一个服务器。

注意: 这种设计有一个主要缺点,因为您永远不知道将来可能会有多少客户。您可以继续复制代码以生成 n 数量的服务器和套接字,但您最终会用完要绑定的端口。

这是假设您的业务大幅增长。一种选择是查看套接字中的命名空间。如果您乐于讨论,请告诉我您有什么新话题。

示例:

服务器:

global.appRoot = require('app-root-path');

var express = require('express');
var session = require('express-session');
var app = express();

var server1 = app.listen(7788, "0.0.0.0", function() {
    console.log('Server listening on port ' + server1.address().port);
});

var server2 = app.listen(5566, "0.0.0.0", function() {
    console.log('Server listening on port ' + server2.address().port);
});

var socket = require('socket.io').listen(server1);
var socket2 = require('socket.io').listen(server2);

socket.on('connect', function (socket) {
    console.log("hi socket 1");
});

socket2.on('connect', function (socket) {
    console.log("hi socket 2");
});

客户:

<!doctype html>
<html>
    <head>
        <script src='https://cdnjs.cloudflare.com/ajax/libs/socket.io/2.0.1/socket.io.js'></script>
        <script>
            var socketClient1 = io('ws://localhost:5566');
            var socketClient2 = io('ws://localhost:7788');
        </script>
    </head>
    <body>
        <ul id='messages'></ul>
    </body>
</html>

输出:

服务器监听 7788 端口

服务器监听 5566 端口

你好插座 1

你好插座 2

【讨论】:

    【解决方案2】:

    我很确定一个 HTTP 实例不能监听多个端口。您应该尝试以下方法:

    let http = require('http').Server(app);
    let io = require('socket.io')(http);
    
    io.on('connect', function (socket) {
    
    });
    
    http.listen(7000, '::1', function () {
        // Now listening
    });
    
    let http2 = require('http').Server(app);
    let io2 = require('socket.io')(http2);
    
    http2.listen(7001, '::1', function () {
        // Now listening
    });
    
    io2.on('connect', function(socket){
    
    });
    

    顺便说一句,我认为您可以通过让它们加入不同的命名空间来使用单个套接字处理多种不同类型的客户端。来自 socket.io 文档:

    https://socket.io/docs/#restricting-yourself-to-a-namespace

    https://socket.io/docs/rooms-and-namespaces/#

    【讨论】:

    • 看起来 ardilgulez 在第二个实例中忘记将 http 更改为 http2
    【解决方案3】:

    我认为你可以在 socketio.js 文件中做这样的事情,

    var port;
    
    if(!process.argv[2] || isNaN(process.argv[2]))
    {
        port = 3030;
        console.log('Port is not set. Default port 3030 is applied');
    }
    else
    {
        port = process.argv[2];
        console.log('port is set to ' + port);
    }
    
    /**
     * Start Listening For Socket IO Connection Requests
     *
     */
    http.listen(port, function ()
    {
        console.log('Socket IO listening on port : ' + port);
    });
    

    可以像这样使用您的特定端口运行套接字 IO 服务器

    node socketio.js 3035
    

    或者通常没有指定端口

    node socketio.js
    

    这样,您可以根据需要运行许多套接字 IO 服务器实例。希望这会有所帮助。

    【讨论】:

      【解决方案4】:
          var express =   require("express");
      
          var app =   express();
      
          app.get('/',function(req,res){
           console.log("Inside app get  method");
      
          });
      
          app.listen(2000,function(){
              console.log("Server is running on port 2000");
          });
      
          app.listen(2001,function(){
              console.log("Server is running on port 2001");
          });
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-12-29
        • 1970-01-01
        • 2012-03-27
        • 1970-01-01
        • 2018-05-13
        相关资源
        最近更新 更多