NodeJs Socket编程如何处理和管理套接字? (不使用socket.io)有效的方法是什么?

时间:2016-12-11 05:57:49

标签: node.js websocket chat

连接到服务器后,每次Data来自此连接(Socket.on('data',...)),服务器都会从UserID获取Data并检查ClientList( Socket对象的数组),以查看UserID中是否存在包含此ClientList的Socket,如果不存在:添加UserID作为Socket的属性,然后添加Socket } object to Client list

因此,当ID = 1的用户想要向ID = 2的用户发送消息时, 服务器在ClientList中搜索具有UserID = 2的Socket以找到正确的Socket并将用户1的消息发送到找到的Socket(用户2的套接字)。

我试图在不使用socket.io的情况下完成此任务!这就是我的雇主让我做的事情! :))

现在我的问题是:我做得对吗?检查ClientList数组(每次连接发送数据时)以查看UserID中是否存在ClientList这是否有效?如果没有,那么正确有效的方法是什么?我的代码没有问题,它的工作原理。但如果有成千上万的连接呢?

任何示例代码,示例或链接都将受到赞赏。谢谢。

这是伪代码:

var net = require('net');
var Server = net.createServer();
var myAuth = require('./myAuth');
var ClientList = [];

Server.on('connection', function(Socket){

    Socket.UserData = {}; // I want to add user data as a property to Socket
    Socket.on('data', function (Data) {

          var userID = myAuth.Authenticate_and_getUserID(Data);

            if(userID != undefined){
                var found = false;
                ClientList.filter(function(item){
                    // check if Socket is in ClientList
                    if(item.UserData.ID == userID){
                        // client was connected before
                        found = true;
                    }
                });

                if(!found){
                    // this is a new connection, Add it to ClientList
                    Socket.UserData.ID = userID;
                    ClientList.push(Socket);
                }
    }

    Socket.once('close', function(has_error){
        var index = ClientList.indexOf(Socket);
        if (index != -1){
           ClientList.splice(index, 1);
           console.log('Client closed (port=' + Socket.remotePort + ').');
        }
    });

});

更新澄清:

每次ClientList来到服务器,检查receiverID(接收者的存在)和使用当前连接更新Data ClientList时,

有效查看UserID socket.io如果不存在?

当用户数量为数千或数百万时,我应该如何管理新连接(用户)并将其存储在服务器中以便以后使用!不是10或100. ClientList如何做到这一点?

以后的用法可能是:

  • 检查一个特定用户是否在线(在"name":"[\"nine\",\"tweleve\",\"four\"]" 中有一个对象)

  • 如果用户在线

  • ,则向用户发送实时消息
  • 等。 。 。

1 个答案:

答案 0 :(得分:1)

其实我做错了!

JavaScript中的数组通过引用传递!因此,每次Socket发送数据时都不需要更新ClientList

因此代码更改如下:

var net = require('net');
var Server = net.createServer();
var myAuth = require('./myAuth');
var ClientList = [];

Server.on('connection', function(Socket){

    ClientList.push(Socket);
    Socket._isAuthorized = false;

    // when socket send data for the first time 
    // it gets authenticated and next time it send data 
    // server does not authenticate it

    Socket.on('data', function (Data) {

          var userID = getUserID(Data);

          if(Socket._isAuthorized != true){
              if(authenticate(Socket)){
                  Socket._isAuthorized = true;
                  Socket._userID = userID;
                  return;
              }
          }
          // do something with data...
    }

    Socket.once('close', function(has_error){
        var index = ClientList.indexOf(Socket);
        if (index != -1){
           ClientList.splice(index, 1);
           console.log('Client closed (port=' + Socket.remotePort + ').');
        }
    });

});

效率很高!