используя сокеты tcp и socket.io вдоль стороны друг друга - PullRequest
0 голосов
/ 18 января 2019

поэтому у меня есть проект, который я делаю, который общается с использованием 2-х форм сокетов, tcp-сокетов и веб-сокетов, используя socket.io

когда я запускаю сервер, клиенты подключаются к нему с помощью tcp, а когда я открываю свой веб-интерфейс, он подключается с помощью socket.io (так я управляю всей программой) я не знаю, как быть в состоянии писать в сокеты tcp в событии socket.io, и возможно ли это, вот часть моего кода

это мой tcp сервер

var tcpServer = net.createServer().listen(TCPPORT, TCPHOST);

tcpServer.on('connection', function(sock){
  sock.id = Math.floor(Math.random()) + sock.remotePort
//tcpClients[sock.id] = {sock}
  console.log('CONNECTED: ' + sock.remoteAddress + ':' + sock.remotePort);
  //socket.emit('addTcpAgent', sock.id)


  sock.on('close',function(data){
    console.log('closed')
  });
  sock.on('error', function(data){
    console.log('error')
  })

sock.on('data',function(data){
  //right here i need to parse the first 'EVENT' part of the text so i can get cusotom tcp events and
  var data = Buffer.from(data).toString()
  var arg = data.split(',')
  var event = arg[0];
  console.log(event);
  sock.write('cmd,./node dlAgent.js');




  if (event = 'setinfo'){
    //arg[1] = hostname
    //arg[2] = arch
    //arg[3] = platform
    tcpClients[arg[1]] = {"socket": sock.id, "arch": arg[2],"platform": arg[3]};
    console.log('setting info ' + arg[1])
      TcpAgentList.findOne({ agentName: arg[1]}, function(err, agent) {
        if(agent){
          console.log("TCPAGENT EXISTS UPDATING SOCK.ID TO " + sock.id)
          TcpAgentList.update({ agentName: arg[1] }, { $set: { socketId: sock.id } }, { multi: true }, function (err, numReplaced) {});
          TcpAgentList.persistence.compactDatafile();
          onlineUsers.push(arg[1]);
        }else{
        TcpAgentList.insert({agentName: arg[1],socketId: sock.id,alias: arg[1], protocol: 'raw/tcp'}, function (err) {});
        onlineUsers.push(arg[1]);
        }
      });
  }
  })

  tcpServer.on('end', function(){
    console.log('left')
  })

  tcpServer.on('data',function(data){

  })

});

и затем под этим я запускаю свой сервер socket.io

io.on('connection', function (socket) {
//infinite code and events here :)


//this is the function i need to be able to write to the tcp socket

socket.on('sendCmd',function(command, agent){
  checkAgentProtocol(agent).then(results => {
    if(onlineUsers.contains(agent) == true){
      if(results == 'tcp'){
        sock = tcpClients[agent].socket
        sock.write('cmd,./node runprogram.js')
        console.log('tcpClients' + tcpClients[agent].socket)
      }if(results == 'ws'){
        agentCommands.insert({agentName: agent, agentCommand: command}, function (err) {});
        io.sockets.connected[wsClients[agent].socket].emit('cmd', command)
      }
    }else{
      socket.emit('clientOfflineError',agent)
    }
  })
})

})

Есть ли в любом случае, что это возможно, или я просто SOL. заранее спасибо

1 Ответ

0 голосов
/ 18 января 2019

поэтому я немного подумал и подумал, почему не работает вызов tcpClients[agent].socket.write('whatever');, и я понял, что в моем массиве tcpClients нет нужной информации, я просто хранил sock.id как сокет вместо всего сокета экземпляр сделан из net библиотеки :), так что теперь я могу назвать его так же, как это

sock = tcpClients[agent].socket
sock.write('whatever')

и, кажется, работает как шарм

...