开发者

Node.js reply tcp server

I am trying to create a simple reply server in node.js

The problem I am having, is that when I telnet into the server, and send a hello, the if loop doesn't catch it, and it goes开发者_运维知识库 to the else.

Below is my code:

var net = require('net');

var server = net.createServer(function(socket) {
// Server start
socket.write('Welcome\n');

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

        dataReceived(socket, data);
    }); 

});

server.listen(8250);

function dataReceived(socket, data) {
    if(data == 'hello') {
    socket.end('Hi');
    } else {
    socket.write(data);
    socket.end('what??\n');
}
}

Thanks.


Data is a binary buffer, not a string. See http://nodejs.org/docs/v0.4.9/api/buffers.html.

Use the buffer.toString method to convert to a string.

Also, a new line will be added when hitting enter in telnet. Not sure if line endings vary by os, but in this case I'm stripping \r\n.

function dataReceived(socket, data) {
  data = data.toString('utf8').replace(/\r\n/, '');

  if(data == 'hello') {
    socket.end('Hi');
  } else {
    socket.write(data);
    socket.end('what??\n');
  }
}


As mentioned, main problem is that you compare Buffer object with string.

There is another problem, most probably not visible in your example.

You don't have control how data is split into packets. 'Hello' sent to your server may result dataReceived called with 'Hel' + 'l' + 'o' buffer 3 times

Correct way to handle 'Hello' input us to create state machine or, more simple and less efficient - buffer all incoming data, look for 'Hello' at the beginning of buffered data, then cut handled data from buffer. There are modules aiming to help to unpack/unframe structured data from input stream, for example node-binary

0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜