2011-07-21 74 views
2

我幾乎可以肯定我不明白TCP服務器的基本概念,並且我沒有將數據視爲流,更糟糕的是,我可能不會使用事件非常好。在NodeJS的TCP服務器上實現簡單身份驗證

我希望tcp服務器寫入套接字'username:',這樣你就可以輸入你的用戶名(在像netcat或telnet這樣的tcp客戶端上),然後tcp服務器必須把下一個數據作爲用戶名。到目前爲止,它確實有效(儘管我幾乎可以肯定有更好的方法可以做到這一點),接下來它應該寫入'password:',​​這樣你可以輸入你的密碼,如果它是正確的,它應該驗證證書和做更多的東西......但是,什麼情況是,當你鍵入密碼,將其寫入再次「密碼:」因爲socket.write('password: ');是自身內部的另一個socket.on('data',function(){//etc});

下面的代碼我到目前爲止:

var net = require('net'); 

var server = net.createServer(function (socket) { 
    socket.addListener("connect", function() { 
     socket.write('username: '); 
     socket.on('data',function(data){ 
      var username = data.toString().replace('\n',''); 
      socket.write('password: '); 
      socket.on('data',function(data){ 
       var password = data.toString().replace('\n',''); 
       // verify authentication here 
       // Do more stuff 
      }); 
     }); 
    }); 
}); 

server.listen('8000','localhost'); 

什麼是正確的實現方式?我只是實現這一點,因爲我需要接收上傳(流),可能沒有結局,並不一次全部來。我試圖用TCP服務器解決這個問題真的很愚蠢嗎?

在此先感謝。

+0

只是一個簡單的答案:嘗試.once或.one而不是on,它應該只觸發一次回調。給出的答案也是正確的,也是一個更完整的解決方案。 –

回答

2

您可以使用節點ftp server來源作爲參考。

代碼中的主要問題:流「數據」事件給你傳入的數據拆分成塊。例如,如果客戶端發出兩個寫入('用戶名:u \ n')和寫入('password:p \ n'),您可能會希望數據內容爲'用戶名:u \ n密碼:p \ n'到25 '數據'事件與「u」,「s」,「e」,「r」等數據緩衝區。您需要緩衝傳入的塊或使用狀態機。