【问题标题】:How to send data to specific sockets created using net.createServer() connection event?如何将数据发送到使用 net.createServer() 连接事件创建的特定套接字?
【发布时间】:2016-02-12 16:44:31
【问题描述】:

当涉及到套接字时,我习惯于 perl 和 POE 编程,并且我正在考虑将 node.js 用于不基于 Web 的应用程序服务器。我通过编写网页用户界面获得了 JavaScript 知识。

我一直在使用 net 模块,并且已经成功地能够同时从多个客户端连接到它。

var net = require('net');
var port = 63146;
var socketNum = 0;

var adminServer = net.createServer(function(socket){
     //add connection count
     socketNum++;
     socket.nickname = "Con# " + socketNum;
     var clientName = socket.nickname;

     console.log(clientName + "connected from " + socket.remoteAddress);
     socket.write("You have been given the client name of " + clientName);
 });

adminServer.listen(port, function() {
    console.log("Server listening at" + port);
});

所以我遇到的问题是,如果我创建了另一个需要向特定客户端发送数据而不是向所有客户端发送数据的函数,我不知道该怎么做。

我在这里和 Google 上进行了广泛的搜索。有很多简单的 tcp 服务器和 echo 服务器到单个客户端的示例,但对于多个客户端则没有。

我正在尝试在没有 socket.io 的情况下执行此操作,因为并非所有客户端都将基于 Web。

任何帮助将不胜感激,

Z

【问题讨论】:

    标签: javascript node.js sockets


    【解决方案1】:

    您必须以某种方式自己存储它们,无论是简单地添加到数组还是添加到以某个唯一标识符为键的对象中。

    这里使用了一个对象:

    var net = require('net');
    var port = 63146;
    var socketNum = 0;
    var sockets = Object.create(null);
    
    var adminServer = net.createServer(function(socket){
         //add connection count
         socketNum++;
         socket.nickname = "Con# " + socketNum;
         var clientName = socket.nickname;
    
         sockets[clientName] = socket;
         socket.on('close', function() {
           delete sockets[clientName];
         });
    
         console.log(clientName + " connected from " + socket.remoteAddress);
         socket.write("You have been given the client name of " + clientName);
     });
    
    adminServer.listen(port, function() {
        console.log("Server listening at" + port);
    });
    

    然后您可以通过分配的昵称找到特定的套接字。

    【讨论】:

      【解决方案2】:

      这是示例工作代码。希望这对其他人有用!

      var net = require('net');
      var port = 63146;
      var conSeen = Object.create(null);
      var socketNum = 0;
      
      var adminServer = net.createServer(function(socket){
           //add connection count
           socketNum++;
           socket.nickname = "Con" + socketNum;
           var clientName = socket.nickname;
           //console.log(socket);
      
       conSeen[clientName] = socket;
      
       socket.on('close', function() {
         delete sockets[clientName];
       });
      
       console.log(clientName + " has connected from " + socket.remoteAddress);
       socket.write("You have been given the client name of " + clientName + "\r\n");
       socket.on('data', function(inputSeen) {
                var clientName = socket.nickname;
                var input = inputSeen.toString('utf8'); 
                input = input.replace(/(\r\n|\n|\r)/gm,"");
                console.log("Saw : " + input + " from " + clientName + "\r\n");
                if (input === 'sendTest') {
                  conSeen[clientName].write('test 123\r\n');
                }
           });
      
      });
      
      
      
      adminServer.listen(port, function() {
          console.log("Server listening on " + port);
      });
      

      【讨论】:

        猜你喜欢
        • 2018-06-29
        • 1970-01-01
        • 1970-01-01
        • 2012-02-13
        • 1970-01-01
        • 1970-01-01
        • 2018-08-03
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多