2016-01-28 6 views
1

Я новичок в node.js, исходя из 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'); 
} 

Когда я пытаюсь отправить какое-то сообщение, оно всегда выводит "Message полученый === [Object] [Object]"

Я попытался заменить JSON.parse на JSON.strngify, но вывод был только некоторым численным, пропозициональным тестом, представленным в ascii.

Как я могу это исправить, так что будет отображать текст я отправить <

+1

'' Полученное сообщение === [Объект] [Объект] "означает, что вы пытаетесь напечатать объекты в виде строк или что вы попытались отправить объект по проводу, не строгая его сначала. Попробуйте просто распечатать объекты сами по себе (не предшествует «Полученное сообщение») и посмотрите, что произойдет. –

+0

Я попробовал это, и вывод все еще [object] [object] – Johnyb

+0

, если ответа не получено до тех пор, пока я не проснусь, я расскажу вам немного о буферах в узле, о том, как они работают и что вызывает проблемы, с которыми вы столкнулись. – GottZ

ответ

1

socket.setEncoding('utf8'); и process.stdin.setEncoding('utf8'); является вашим другом. вам просто нужно добавить его один раз перед линией, в которой вы ожидаете данные, и все должно работать так, как вы думали об этом на начальном этапе.

+0

отлично! Спасибо, теперь я получаю сообщение, но с \ r \ n в конце, есть ли способ предотвратить это или является единственным способом regExp? – Johnyb

+0

\ r \ n есть по какой-то причине. ваш process.stdin считывает строку с буферизацией. это приводит к тому, что stdin запускает данные только после нажатия кнопки возврата. return btw равно \ r \ n – GottZ

+0

, вы можете просто удалить его, используя что-то вроде regex: 'msg = msg.replace (/ \ r \ n $ /," ");' это отменит \ r \ n на конец строки (если она действительно найдена), если ее не обнаружено, выход такой же, как и вход. – 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

Смежные вопросы