2013-09-25 28 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

相关问题