2011-07-19 81 views
2

我試圖創造的Node.jsNode.js的答覆TCP服務器

我遇到的問題簡單地回答服務器,就是當我遠程登錄到服務器,併發送一個招呼,如果在沒有按環沒有抓住它,而是轉向別人。

下面是我的代碼:

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

順便說一下,你應該使用'nc'而不是'telnet'來進行測試。 – Hello71

+0

遠程登錄顯示你很多更多的信息,你爲什麼要使用NC? – rissicay

回答

7

數據是二進制緩衝區,而不是字符串。見http://nodejs.org/docs/v0.4.9/api/buffers.html

使用buffer.toString方法轉換爲字符串。

另外,當按telnet進入時會添加一個新行。不知道如果行結尾因操作系統而異,但在這種情況下,我正在剝離\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

如前所述,主要問題是您將Buffer對象與字符串進行比較。

還有一個問題,很可能在您的示例中不可見。

您無法控制數據如何拆分爲數據包。 '你好'發送到你的服務器可能導致dataReceived調用'Hel'+'l'+'o'緩衝區3次

正確的方式來處理'你好'輸入我們創建狀態機,或者更簡單,效率更低 - 緩存所有傳入數據,在緩存數據的開始處查找「Hello」,然後從緩衝區中刪除處理的數據。有模塊旨在幫助從輸入流解壓/結構化數據,例如node-binary

+2

有時候..深夜,我認爲服務器的創建只會更容易在c – rissicay