Nodejs作为通过套接字的请求/响应服务器的客户端

我正在尝试用sailsjs构build一个web服务器。

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

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

另一个select是为每个命令或请求打开和closures一个套接字:我发现它甚至是最糟糕的。

有一个聪明的办法来做我所需要的?

编辑:

这里是套接字(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); } }); } }); }, } 

一个可能的解决scheme是创build响应路由器,根据请求名称触发特定的callback。

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

步骤1

创build驱动程序服务: 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

现在,您可以将任何types的callback绑定到特定的请求。

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

API /服务/ 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 /控制器/ 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()来防止绑定多个事件侦听器。

希望有所帮助。