Socket.io如何监听多个端口?

5

我进行了一些搜索,但没有找到关于这个主题的最新答案,因为找到的答案只适用于旧版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 中使用命名空间吗?这样客户端仍然连接到特定的端口,但它们进入一个单独的命名空间。 - Samuel Toh
@SamuelToh 抱歉,我不明白。 - pizzae
4个回答

4
我不确定app是什么,假设你正在使用流行的express服务器模块。是的,这是可能的。
你可以通过让主NodeJS进程生成2个express服务器来实现。每个服务器监听特定的端口。然后有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

我认为您可以在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);
});

您可以按照以下方式运行socket IO服务器,使用您指定的端口。
node socketio.js 3035

或者通常不指定端口号

node socketio.js

这样做可以运行许多Socket IO服务器实例,按您的意愿。希望这能帮助某些人。

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/#


1
看起来ardilgulez在第二个实例中忘记将http更改为http2了。 - Diogyn

0
    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");
    });

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接