2013-09-25 31 views
-1

如果客戶端發送JSON,則我的TCP套接字數據處理程序在try塊中正常工作。但是,我也想通過telnet支持一些基本的「終端命令」,所以如果解析器失敗,catch塊應該嘗試識別支持的,但我總是得到默認響應SyntaxError ...爲什麼在我的捕獲工作中不是這種情況?

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

     try{ 

      var json = JSON.parse(data); 

      switch(json.event){ 

       default: 
        console.log('unhandled event:'+json.event); 
       break; 

      } 

     }catch(err){ 

      console.log("CLIENT SAID: "+data); 

      switch(data){ 

       case "echo": 
        socket.write("ECHO:"+data+"\n"); 
       break; 

       case "clients": 
        socket.write("CLIENTS:"+clients.length+"\n"); 
       break; 

       default: 
        socket.write('ERROR:'+err+"\n"); 
       break; 
      } 

     } 

    }); 
+0

而不是'console.log(「...」+ data)',嘗試'console.log(data)'看'data'是否實際上是一個字符串。 – Passerby

+0

當你說你得到「語法錯誤」響應時,你是什麼意思?你從哪裏得到的?它從何而來? – Pointy

+0

@Passerby - 有趣的是,它記錄<緩衝區68 65 79 0d 0a> –

回答

2

您不接受完整回覆。您應該從流中收集數據並等待直到數據完全收到爲止。

var body = ''; 

socket.setEncoding('utf8'); 
socket.on('data', function(data) { 
    body += data; 
}); 

socket.on('end', function() { 
    try { 
    var json = JSON.parse(body); 
    switch (json.event) { 
     default: console.log('unhandled event:' + json.event); 
     break; 
    } 
    } catch (err) { 
    console.log("CLIENT SAID: " + body); 
    switch (data) { 
    case "echo": 
     socket.write("ECHO:" + body + "\n"); 
     break; 
    case "clients": 
     socket.write("CLIENTS:" + clients.length + "\n"); 
     break; 
    default: 
     socket.write('ERROR:' + err + "\n"); 
     break; 
    } 
    } 
}); 
+0

好的。這是有道理的,但現在沒有任何我通過telnet發送觸發'結束'事件。身體只是在不斷增長。 –

+0

啊,由於套接字保持打開狀態,您將不得不沿着分隔符發送消息並標記JSON正文的結束位置。每次數據事件觸發時都可以檢查分隔符。 – hexacyanide

相關問題