2011-07-19 10 views
2

私はNode.jsののNode.jsは、TCPがサーバー

私が午前問題で、単純な応答サーバを作成しようとしていますされて返信その私は、サーバーにtelnet、およびハロー、もしループのdoesnを送信するときそれをキャッチして、それは他人に行きます。

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'); 
} 
} 

ありがとう:

以下は私のコードです。

+0

'console.log(data)'を試したことがありますか? – Raynos

+0

ところで、実際には、テストのために 'telnet'ではなく' nc'を使ってください。 – Hello71

+0

telnetはあなたに多くの情報を表示します、なぜncを使用しますか? – rissicay

答えて

7

データはバイナリバッファであり、文字列ではありません。 http://nodejs.org/docs/v0.4.9/api/buffers.htmlを参照してください。

buffer.toStringメソッドを使用して文字列に変換します。

また、telnetでenterを押すと、新しい行が追加されます。行末がosによって異なるかどうかはわかりませんが、この場合、私は\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'); 
    } 
} 
2

前述したように、主な問題は、バッファオブジェクトと文字列を比較することです。

別の問題があります。ほとんどの場合、あなたの例では見えません。

データをパケットに分割する方法を制御することはできません。あなたのサーバーに送信された 'Hello'は、 'Hel' + 'l' + 'o'バッファで3回呼び出されたdataReceivedになります。

ステートマシンを作成するための正しい方法、 - すべての受信データをバッファリングし、バッファされたデータの先頭に 'Hello'を探し、バッファから処理されたデータを切り取ります。 node-binary

+2

時々..夜遅く、私はサーバーの作成がちょっとだけ簡単だと思う – rissicay

関連する問題