Socket.io在多个端口上监听?

时间:2017-05-31 06:20:19

标签: node.js socket.io

我做了一些搜索,找不到有关此主题的任何更新答案,因为找到的答案仅适用于旧版本的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实例一次监听两个不同的端口。这样我可以适当地处理两种不同类型的客户端,让它们连接到适当的套接字,然后以不同的方式处理这两个组。

如何做到这一点?

4 个答案:

答案 0 :(得分: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 :(得分: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);
});

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

node socketio.js 3035

或通常没有指定的端口

node socketio.js

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

答案 2 :(得分:1)

我不确定app是什么,假设您正在使用流行的express服务器模块。是的,有可能做到。

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

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

假设您的业务发展迅速。 1选项是查看套接字中的命名空间。如果您乐意讨论,请告诉我您已经开启了一个新主题。

示例:

服务器:

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

答案 3 :(得分: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");
    });