3
var net = require('net');

var HOST = '0.0.0.0';
var PORT = 5000;

// Create a server instance, and chain the listen function to it
// The function passed to net.createServer() becomes the event handler for the 'connection' event
// The sock object the callback function receives UNIQUE for each connection
net.createServer(function(sock) {

// We have a connection - a socket object is assigned to the connection automatically
console.log('CONNECTED: ' + sock.remoteAddress +':'+ sock.remotePort);

// Add a 'data' event handler to this instance of socket
sock.on('data', function(data) {

    console.log('DATA ' + sock.remoteAddress + ': ' + data);
    // Write the data back to the socket, the client will receive it as data from the server
    if (data === "exit") {
        console.log('exit message received !')
    }

});

// Add a 'close' event handler to this instance of socket
sock.on('close', function(data) {
    console.log('CLOSED: ' + sock.remoteAddress +' '+ sock.remotePort);
});

}).listen(PORT, HOST);

console.log('Server listening on ' + HOST +':'+ PORT);

No matter what I try, I cannot get:

    if (data === "exit") {
        console.log('exit message received !')
    }

working, it's always false.

I'm connecting via telnet and sending "exit", the server should then go into the "if" loop and say "exit message received". This never happens, can someone shed some light ? thanks

biergardener
  • 185
  • 1
  • 1
  • 11

2 Answers2

1

That's because data is not a string, if you try to compare with === you will get false because types don't match. To solve it you should compare the data object with a simple == or use socket.setEncoding('utf8') previous to binding the data event.

https://nodejs.org/api/net.html#net_event_data

var net = require('net');
var HOST = '0.0.0.0';
var PORT = 5000;

net.createServer(function(sock) {
    console.log('CONNECTED:',sock.remoteAddress,':',sock.remotePort);
    sock.setEncoding("utf8"); //set data encoding (either 'ascii', 'utf8', or 'base64')
    sock.on('data', function(data) {
        console.log('DATA',sock.remoteAddress,': ',data,typeof data,"===",typeof "exit");
        if(data === "exit") console.log('exit message received !');
    });

}).listen(PORT, HOST, function() {
    console.log("server accepting connections");
});

Note. If the data received is going to be big you should concatenate and handle the message comparison at the end of it. Check other questions to handle those cases:

Node.js net library: getting complete data from 'data' event

Community
  • 1
  • 1
shuji
  • 7,369
  • 7
  • 34
  • 49
  • 1
    The encoding hint is correct. But it will still not work reliably in general because the socket might not emit exactly the requested bytes at once. "exit" might be spread over several received buffers or might be contained in a Buffer which also contains other data. – Matthias247 Apr 28 '16 at 22:03
  • You are right about that, many variables can happen in the input data that should be handled but to solve his issue telnet will not chunk his string "exit", it's too small. – shuji Apr 29 '16 at 01:56
1

I am aware this is quite an old post, when I tried to implement the code in the answer to this question I came across the same problem regardless of having used "==" or utf8 encoding. The issue for me turned out to be that the client I was using was appending a '\n' character to the end of the exit message thus causing the string comparison to fail on the server. Perhaps this is not an issue with telnet and the like but this was the case with netcat. Hopefully this sheds some light for anyone else who comes across this post and has the same problem that I did.

Ace
  • 97
  • 8