2017-09-14 47 views
1

我對Nodejs相當陌生,我正在構建一個應用程序ssh到遠程機器並得到tail -f的日誌文件。Nodejs爲客戶端產生遠程的尾部和socket-io

的我收到我經由socket-io發送到客戶機的日誌文件(版本2.0.3。)線

現在我面對的是,當第二瀏覽器嘗試tail一個問題不同的日誌,新的日誌被髮送到兩個瀏覽器,而不是隻發出請求的那個。 我不確定這是否與我的socket-io代碼或child_process存在問題。

這裏的服務器:

const express = require('express'), 
    app = express(), 
    path = require('path'), 
    bodyParser = require('body-parser'), 
    logger = require('morgan'), 
    server = require('http').Server(app), 
    io = require('socket.io')(server), 
    spawn = require('child_process').spawn, 
    events = require('events'), 
    eventEmitter = new events.EventEmitter(); 


// Fix body of requests 
app.use(bodyParser.urlencoded({extended: true})); 
app.use(bodyParser.json()); 

// Log the requests 
app.use(logger('dev')); 

// Serve static files 
app.use(express.static(path.join(__dirname, '.'))); 

// Add a basic route – index page 
app.get('/', function (req, res) { 
    res.sendFile(path.join(__dirname, 'index.html')); 
}); 

io.on('connection', (socket) => { 
    console.log(`client connected ${socket.client.id}`); 
    eventEmitter.on('tail', (data) => { 
     socket.tail = spawn('ssh', ['[email protected]' + 'quality-p.company.com', 'tail -f', data.service], { shell: true }); 
     socket.tail.stdout.on('data', (data) => { 
      console.log(`got new data ${data.toString()}`); 
      socket.emit('newLine', {line: data.toString().replace(/\n/g, '<br />')}); 
     }); 
    }); 
}); 

app.get('/tail', (req, res) => { 
    eventEmitter.emit('tail', req.query); 
    res.sendStatus(200); 
}); 

// Bind to a port 
server.listen(3005,() => { 
    console.log('running on localhost:' + 3005); 
}); 

客戶:

<!DOCTYPE html> 
<html lang="en"> 
<head> 
    <meta charset="UTF-8"> 
    <script src="./node_modules/socket.io-client/dist/socket.io.js"></script> 
    <script src="https://code.jquery.com/jquery-3.2.1.min.js"></script> 
    <script> 
     $(() => { 
      let socket = io(); 
      socket.on('connect',() => { 
       console.log('connected'); 
      }); 
      socket.on('newLine', (data) => { 
       console.log(`new data: ${data.line}`); 
       $("#tailing").append(data.line); 
      }); 
      $('#tail').click(() => { 
       $.get('/tail', { 
        service: $('#service').val() 
       }); 
      }); 
     }); 
    </script> 
    <title>Title</title> 
</head> 
<body> 
<select id="service"> 
    <option id="tnet" value="/var/log/tnet">tnet</option> 
    <option id="consul" value="/var/log/consul">consul</option> 
</select> 
<button id="tail">tail</button> 
<div id="tailing" style="background-color: antiquewhite;"> 
</div> 
</body> 
</html> 
+0

這是預期haviour。所有套接字都使用相同的'eventEmitter',因此它們正在接收'tail'事件。你應該用socket.io替換'GET'請求,這樣你就可以將'tail'綁定到單獨的套接字上。 –

回答

1

服務器

const express = require('express'), 
    app = express(), 
    path = require('path'), 
    bodyParser = require('body-parser'), 
    logger = require('morgan'), 
    server = require('http').Server(app), 
    io = require('socket.io')(server), 
    spawn = require('child_process').spawn; 


// Fix body of requests 
app.use(bodyParser.urlencoded({ 
    extended: true 
})); 
app.use(bodyParser.json()); 

// Log the requests 
app.use(logger('dev')); 

// Serve static files 
app.use(express.static(path.join(__dirname, '.'))); 

// Add a basic route – index page 
app.get('/', function(req, res) { 
    res.sendFile(path.join(__dirname, 'index.html')); 
}); 

var tails = {}; 

io.on('connection', (socket) => { 
    console.log(`client connected ${socket.client.id}`); 
    socket.on('tail', (data) => { 
     socket.join(data.service); 
     if (typeof tails[data.service] == "undefined") { 
      tails[data.service] = spawn('ssh', ['[email protected]' + 'quality-p.company.com', 'tail -f', data.service], { 
       shell: true 
      }); 
      tails[data.service].stdout.on('data', (data) => { 
       console.log(`got new data ${data.toString()}`); 
       io.to(data.service).emit('newLine', { 
        line: data.toString().replace(/\n/g, '<br />') 
       }); 
      }); 
     } 
    }); 
}); 


// Bind to a port 
server.listen(3005,() => { 
    console.log('running on localhost:' + 3005); 
}); 

客戶

<!DOCTYPE html> 
<html lang="en"> 

<head> 
    <meta charset="UTF-8"> 
    <script src="./node_modules/socket.io-client/dist/socket.io.js"></script> 
    <script src="https://code.jquery.com/jquery-3.2.1.min.js"></script> 
    <script> 
     $(() => { 
      let socket = io(); 
      socket.on('connect',() => { 
       console.log('connected'); 
      }); 
      socket.on('newLine', (data) => { 
       console.log(`new data: ${data.line}`); 
       $("#tailing").append(data.line); 
      }); 
      $('#tail').click(() => { 
       socket.emit('tail', { 
        service: $('#service').val() 
       }); 
      }); 
     }); 
    </script> 
    <title>Title</title> 
</head> 

<body> 
    <select id="service"> 
    <option id="tnet" value="/var/log/tnet">tnet</option> 
    <option id="consul" value="/var/log/consul">consul</option> 
</select> 
    <button id="tail">tail</button> 
    <div id="tailing" style="background-color: antiquewhite;"> 
    </div> 
</body> 

</html> 
+0

非常感謝。這真的很有幫助! – Moshe