Node.js 无法使用Sails和socket.io获得与第三方守护程序的持久套接字连接

Node.js 无法使用Sails和socket.io获得与第三方守护程序的持久套接字连接,node.js,socket.io,sails.js,Node.js,Socket.io,Sails.js,我是node.js的新手,尝试使用ProtoBuf、sails和Socket.io与第三方守护进程进行持久套接字连接 在过去的两周里,我在Stack Overflow和其他论坛上进行了搜索,并发布了这个问题,以获得您宝贵的回复 情景: 有一个第三方守护进程(同步)运行在端口5001上,它应该与客户端有持久的套接字连接。如果没有通信发生,此守护进程将等待30秒并关闭套接字 使用下面的代码示例,Im无法在server.js和第三方守护程序之间获得持久套接字连接(使用节点的net API)。每次在向第

我是node.js的新手,尝试使用ProtoBuf、sails和Socket.io与第三方守护进程进行持久套接字连接

在过去的两周里,我在Stack Overflow和其他论坛上进行了搜索,并发布了这个问题,以获得您宝贵的回复

情景:

有一个第三方守护进程(同步)运行在端口5001上,它应该与客户端有持久的套接字连接。如果没有通信发生,此守护进程将等待30秒并关闭套接字

使用下面的代码示例,Im无法在server.js和第三方守护程序之间获得持久套接字连接(使用节点的net API)。每次在向第三方守护进程发送EncryptRequest和UserRequest消息时创建新套接字id时,server.js都会创建新套接字并每次连接到192.168.1.3:5001

因此,我将套接字初始化和连接移到server.js中的io.sockets.on('connection',…)行上。在本例中,我只建立了一个套接字连接(持久),但它在控制器上执行回调以运行多次

我采取了以下步骤: a) 我已经使用命令“sailsnewwebgui”创建了一个sails应用程序

b) 我在webgui/api/controllers/SampleController上创建了一个控制器。 它有getAuth()方法,该方法在webgui/config/routes.js中有一个路由条目

“/webgui/auth”:“SampleController.getAuth”

每当我输入时,它都会与第三方守护进程对话并获得响应

c) 第三方守护程序连接逻辑写入一个新的配置文件,并存储在config/server.js中。 我正在为使用sails的PoC创建这个原型

目前,SampleController.js是我的客户机。我现在不使用任何html

流程是:

         Sails Application

-----------------------------------------                     -------------------
|   mysamplehost on port 1337           |                     |                 |
|                                       |                     |                 |
|  -------------        ------------    |                     |                 |
|  |  Client   |        | HTTP     |    | Requires Persistent | 3rd Party       |
|  |           |        |Server    |    | Socket Connection   | daemon running  |
|  | SampleCon |  8081  |running on|    | on Port 5001        | on Port 5001    |
|  |troller.js |<------>|Port 8081 |<------------------------>|                 |
|  |           |        |          |    |                     |                 |
|  |           |        |          |    |                     |                 |
|  |           |        | server.js|    |                     |                 |
|  |           |        |          |    |                     |                 |
|  -------------        ------------    |                     |                 |
|                                       |                     |                 |
-----------------------------------------                     -------------------
config/server.js:
我想说的第一件事是,如果你真的是一个节点新手,那么你正试图做得太快太多。这甚至不像是一个Sails应用程序。如果您在Sails框架内,则不必执行大多数这些要求。另外,Sails已经包含了socket.io功能,您应该了解这些功能,如果没有客户端代码,很难判断这里可能发生了什么。@HeadCode我已经从上面的config/server.js中删除了不必要的需求,并添加了创建Sails应用程序和应用程序流的步骤。请再次参考我更新的帖子。图表真的很有帮助!我现在太忙了,没时间看这个,但是如果你还没有解决这个问题,我会在这个周末回来。我有一个问题:您是否运行两个单独的节点应用程序?一个在1337端口,一个在8081端口?@HeadCode谢谢你的帮助。我会设法解决的。我没有运行两个节点的应用程序。节点应用程序使用在端口1337上运行的sails,Http服务器在端口8081上运行,端口8081用于在sails控制器和配置文件(Server.js)之间进行通信。配置文件在端口5001上打开了一个客户端TCP套接字(使用节点的net API),该端口与第三方守护进程通信。答:我已将TCP套接字连接(客户端连接)移动到server.js中的“message”事件处理程序之外,以防在处理新ProtoBuf消息时创建多个连接。这只会导致创建单个套接字连接。
var socket = require('socket.io-client')('http://192.168.1.2:8081',{'force new connection': true});
module.exports = {
getAuth: function(req, res) {

    socket.binaryType = "arraybuffer"; // We are talking binary
    var ProtoBuf = require("protobufjs");
    var FPMessage = ProtoBuf.loadProtoFile("/webgui/api/protobuf/pb_common.proto").build("ProtoBuf.BaseMessage");

    var pb_login_builder = ProtoBuf.loadProtoFile("/webgui/api/protobuf/pb_login.proto");

    var EncryptRequest = pb_login_builder.build("ProtoBuf.EncryptRequest");
    var EncryptResponse = pb_login_builder.build("ProtoBuf.EncryptResponse");
    var UserRequest = pb_login_builder.build("ProtoBuf.UserRequest");
    var UserResponse = pb_login_builder.build("ProtoBuf.UserResponse");

    socket.on('connect', function () {

        var msg = new EncryptRequest();
        msg.device_id = "";
        msg.msg_name = "EncryptRequest";
        msg.type = "none";
        socket.emit('message', msg.toArrayBuffer());

        socket.on('myMsg', function (evt) {
          try {
                var msgName = FPMessage.decode(evt);

                if(msgName.msg_name == 'EncryptResponse') {
                    var msg = EncryptResponse.decode(evt);
                    var hq_device_id = msg.device_id;
                    console.log("EncryptResponse - HQ Device ID : "+hq_device_id+"\n");

                    var msg2 = new UserRequest();
                    msg2.device_id = "";
                    msg2.msg_name = "UserRequest";
                    msg2.username = "Administrator";
                    socket.emit('message', msg2.toArrayBuffer());
                }
                else if(msgName.msg_name == 'UserResponse') {
                    var msg = UserResponse.decode(evt);
                    var hq_device_id2 = msg.device_id;
                    console.log("UserResponse - HQ Device ID : "+hq_device_id2);
                    socket.removeAllListeners();
                    return res.json(msg);
                }
            } catch (err) {
                console.log("Error: "+err+"\n");
            }
        });

        socket.on('disconnect', function () {
            console.log("disconnected.");
        });

    });
}
};
var sails = require('sails'),
path = require('path'),
ProtoBuf = require('protobufjs'),
net = require('net'),
server = require('http').createServer(function(request,response){}).listen(8081),
io = require('socket.io').listen(server);

var HOST = "192.168.1.3";
var PORT = 5001;
var XD_HDR_LEN = 4; /* xtremed data header length (bytes) */

var client = new net.Socket();
var client_conn = client.connect(PORT, HOST);
client_conn.setTimeout(15000);

var builder = ProtoBuf.loadProtoFile(path.join(__dirname, "./../api/protobuf", "pb_common.proto")),
fpMessage = builder.build("ProtoBuf.BaseMessage");

server.on("listening", function(){
    sails.log.info('Server started');
});

server.on("error", function(err) {
    console.log("Failed to start server:", err);
    process.exit(1);
});

io.sockets.on('connection', function(socket){

   sails.log.info("New socket Connection - Socket id : "+socket.id);  

   socket.on("message", function(message) {
        try {
            var buf = addMessageHeader(message);
            sails.log.info("Connected to: " + HOST + ":" + PORT);
            client.write(buf);
        } catch(err) {
            sails.log.error("websocket message failed! ", err);
        }           
   });
  client_conn.on("data", function(data2) {
     var data3 = stripMessageHeader(data2);
     io.emit('myMsg',data3);
  });

  client_conn.on('close', function() {
    sails.log.info('Connection closed');
   });

  socket.on("close", function() {
      socket.disconnect();
      //socket.removeAllListeners();
      sails.log.info("Client socket closed." );
   });
 });

/*  In: Buffer object
 * Out: Buffer object
*/
function addMessageHeader(message)
{
var version = 1;
var options = 0;

var buf = new Buffer(message.length + XD_HDR_LEN);

//Message header: { u32 version:4, options:4, length:24; }
buf[0]  = version; /* TODO: support options */
buf[1]  = (message.length & 0xFF);
buf[2]  = ((message.length & 0xFF00) >> 8);
buf[3]  = ((message.length & 0xFF000) >> 16);
message.copy(buf, XD_HDR_LEN);
return buf;
}

/*
 *  In: Buffer object
 * Out: Buffer object
*/
function stripMessageHeader(buffer)
{
/* note: slice uses existing buffer */
return buffer.slice(XD_HDR_LEN);
}