2016-01-28 489 views
1

我剛剛接觸j.js背景的node.js,我很難理解背後的東西背後的概念,目前我正在嘗試創建簡單的控制檯聊天。代碼服務器:簡單的TCP聊天node.js

var net=require("net"); 
var sockets=[]; 
net.createServer(function(socket){ 
    sockets.push(socket); 

    socket.on("data",function(data){ 
     posliSpravu(socket,JSON.parse(data)); 
    }); 

    socket.on("close",function(){ 
     console.log(socket + " has disconnected"); 
     sockets.splice(sockets.indexOf(socket),1); 
    }) 

}).listen(8888); 

function posliSpravu(from,message){ 
    var msg=JSON.stringify("Niekto povedal : " + message)+'\n'; 
    sockets.forEach(function(incoming_socket){ 
     if(incoming_socket!=from){ 
      incoming_socket.write(msg); 
     } 
    }) 
} 

客戶端代碼

var net=require("net"); 
var client=new net.Socket(); 
client.connect(8888,function(){ 
    console.log("Connected"); 
}); 
process.stdin.resume(); 
process.stdin.on("data",function(data){ 
    posli(data); 
}) 
client.on("data",function(data){ 
    console.log("Recieved data === " + JSON.parse(data)); 
}) 



function posli(msg){ 
    client.write(JSON.stringify(msg)+'\n'); 
} 

當我試圖發送一些信息,它總是輸出 「消息收到=== [對象] [對象]」

我試圖用JSON.strngify替換JSON.parse,但輸出只是一些數字,可以用ascii表示。

如何解決它,所以它會顯示文字我送<

+1

'「Message received === [Object] [Object]」'表示您試圖將對象打印爲字符串,或者您試圖通過電線發送對象而不先將其串化。嘗試只是自己打印對象(不要在「收到消息」之前),看看會發生什麼。 –

+0

我試了一下,輸出仍然是[對象] [對象] – Johnyb

+0

如果沒有答案,直到我醒來,我會告訴你一些關於緩衝區的節點,它們是如何工作的,以及導致你遇到麻煩的原因。 – GottZ

回答

1

socket.setEncoding('utf8');process.stdin.setEncoding('utf8');是你的朋友。你只需要在你等待數據的行之前添加一次,並且一切都應該按照你最初想到的那樣工作。

+0

太棒了!謝謝,我現在收到消息,但最終\ r \ n,有什麼辦法如何防止這種或是regExp的唯一方法嗎? – Johnyb

+0

\ r \ n是有原因的。您的process.stdin正在緩衝讀取行。這隻會導致stdin只在您按回車時觸發數據。 return is btw等於\ r \ n – GottZ

+0

您可以簡單地使用類似正則表達式的方法刪除它:'msg = msg.replace(/ \ r \ n $ /,「」);'這將消除\ r \ n at如果找不到字符串(如果找到它),則輸出與輸入相同。 – GottZ

0

要調用JSON.stringify在一根繩子上。確保你使用了一個有效的對象。也更好地通過網絡發送的實際JSON:

//server 
var msg=JSON.stringify({ name: 'Niekto povedal', content: message }); 

// client 
var message = JSON.parse(data); 
console.log("Recieved data from :" + message.name); 
console.log("Recieved data === " + JSON.stringify(message.content)); 
+0

已接收的數據來自:Niekto povedal 已接收的數據=== {「type」:「Buffer」,「data」:[97,104,111,106,13,10]} 這就是我得到的,仍然是ASCII碼的字符。 – Johnyb