【问题标题】:Nodejs as a client to a Request/Response server via socketNodejs 通过套接字作为请求/响应服务器的客户端
【发布时间】:2014-09-12 08:22:24
【问题描述】:

我正在尝试使用sailsjs 构建网络服务器。

为了执行它的请求,我的服务器需要连接到一个套接字来传递命令并等待响应。

对于每个命令,我等待特定的响应并且必须调用特定的回调。目前我只打开一个套接字并在每次请求时更改“onData”套接字。看起来效果不好,而且很丑。

另一种选择可能是为每个命令或请求打开和关闭一个套接字:我觉得它更糟糕。

有什么聪明的方法可以做我需要的吗?

已编辑:

这里是套接字(DriverConnection.js):

module.exports = {

    connect: function(callback){
        var net = require('net');
        client = net.connect({port: 13}, function() { //'connect' listener
            console.log('client connected');
            callback();
        });
    },

  command: function(command, callback){
    client.write(command);
    client.on('data', function(data) {
      console.log("parsing data " + data.toString());
      callback(JSON.parse(data.toString()));
    });
  }

};

这里是它的请求用法示例:

module.exports = {

    list: function(req,res) {
      DriverConnection.command('{}',function(data){
        for(key in data) {
          var mac = data[key];
          Autoreez.findOne({name : mac},function (err,auto){
            if(!auto) {
              User.create({name : mac}, function(err,user){
                res.send(user);
              });
            } else {
              res.send(auto);
            }
          });
        }
      });
    },
}

【问题讨论】:

    标签: node.js sockets request client sails.js


    【解决方案1】:

    一种可能的解决方案是创建响应路由器,根据请求名称触发特定回调。

    由于 net 模块本身不支持此类行为,因此您需要使用某种库或使用(例如)EventEmitter 编写自己的路由器。

    第 1 步

    创建驱动服务:api/services/DriverService.js

    var net = require('net');
    module.exports = {
        connection: null,
    
        // open connection
        connect: function(cb) {
            var self = this;
    
            this.connection = net.connect({ port: 13 }, cb);
    
            // response router
            this.connection.on('data', function(data) {
                var res = JSON.parse(data.toString());
                self.connection.emit(res.req, res.msg);
            });
        },
    
        // close connection
        disconnect: function() {
            this.connection.end();
        },
    
        command: function(cmd) {
            this.connection.write(cmd);
            // return an instance of event emitter
            return this.connection;
        }
    };
    

    第 2 步

    接下来,在sails 应用程序启动时连接到您的套接字服务器,并在停止时断开连接。

    // config/bootstrap.js
    module.exports.bootstrap = function(cb) {
        // connect to service
        DriverService.connect(cb);
    };
    
    // config/teardown.js
    module.exports.beforeShutdown = function(cb) {
        // disconnect from service
        DriverService.disconnect();
        cb();
    };
    

    第 3 步

    修改您的套接字服务器以发送带有请求名称的响应。

    // ...
    socket.on('data', function (data) {
        var reqName = data.toString();
        socket.write(JSON.stringify({ req: reqName, msg: 'some response' }));
    });
    // ...
    

    第 4 步

    现在,您可以将任何类型的回调绑定到特定请求。

    如果您愿意,可以在 DriverService 中绑定它们(在 connect() 函数中) 或在您的应用程序控制器中动态地,如下所示:

    api/services/DriverService.js

    this.connection
        .on('data', function(data) {
            var res = JSON.parse(data.toString());
            self.connection.emit(res.req, res.msg);
        })
        .on('list', function(data) { /* ... */ })
        .on('add', function(data) { /* ... */ })
    

    api/controllers/SomeController.js

    module.exports = {
        list: function(req, res) {
            DriverService.command('list')
                .once('list', function(data) {
                    console.log('callback for list request');
                    res.send(data);
                })
                .once('add', function(data) {
                    console.log('callback for add request');
                    res.send(data);
                });
        }
    }
    

    在控制器中绑定的情况下,必须使用once()来防止绑定多个事件监听器。

    希望对您有所帮助。

    【讨论】:

    • 这或多或少是我已经在做的事情,但这并不能回答我的问题。问题是如何在每个特定请求的数据接收时正确触发特定功能?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-03-07
    • 1970-01-01
    • 2017-11-05
    • 2011-08-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多