【发布时间】:2015-11-27 05:39:49
【问题描述】:
我目前正在使用 NodeJs 进行自我训练并尝试进行简单的聊天。为此,我使用包 'json-socket' 在客户端和服务器之间交换 json 对象。 原理很简单:
- 我启动服务器
- 那么每个客户端都要给一个伪
- 完成后,在服务器端注册
- 然后当客户端发送消息时,它会广播给所有其他客户端
但是我遇到了问题:
- 假设服务器已启动
- 当第一个客户端连接时,什么也没有发生。我的意思是他没有在服务器端注册,服务器端没有显示任何日志
- 我终止了该客户端的会话 (Ctrl + c) 并尝试使其再次连接。这次成功了,他注册得很好
- 我启动了一个新客户端。这次他注册了4次:|
- 我启动了另一个新客户端。这次他注册了9次:| :|
我只是不明白为什么。请在下面找到代码...
服务器.js
var net = require('net'), JsonSocket = require('json-socket');
var sockets = [];
var server = net.createServer(function(socket)
{
server.on('connection', function(socket) { //This is a standard net.Socket
socket = new JsonSocket(socket); //Now we've decorated the net.Socket to be a JsonSocket
console.log('Connection');
socket.on('message', function(message) {
console.log("0");
if (message.isMessage == null)
{
console.log("1");
var sender = message.pseudo;
sockets.push({socket : socket, pseudo : sender});
sockets.forEach(function(s)
{
if (s.pseudo.toString() != sender.toString())
s.socket.sendMessage(sender + " vient de se connecter");
});
console.log(sender + " vient de se connecter");
console.log("Il y a " + sockets.length + " clients connectés");
}
else
{
console.log("2");
var sender = message.pseudo;
sockets.forEach(function(s)
{
if (s.pseudo.toString() != sender.toString())
{
console.log("3");
s.socket.sendMessage(sender + " : " + message.message);
}
});
}
});
});
socket.on('error', function()
{
socket.emit('end');
});
socket.on('end', function()
{
// TODO : fix this part
//sockets.slice(sockets.indexOf(socket), 1);
console.log("Il reste " + sockets.length + " clients connectés");
});
});
server.on('listening', function()
{
console.log('Server launched');
});
server.listen(3000);
客户端.js
var net = require('net');
var stream = require('stream');
var JsonSocket = require('json-socket');
var readable = new stream.Readable();
var port = 3000;
var host = '127.0.0.1';
var client = new JsonSocket(new net.Socket());
// first step : pseudo init
var pseudo = '';
console.log('Give a pseudo');
readable.setEncoding('utf8');
readable._read = function(size)
{
process.stdin.removeAllListeners('data').on('data', function(chunk)
{
readable.push(chunk);
});
};
readable.on('data', function(chunk)
{
if (pseudo.length == 0)
{
// TODO : méthode utilitaire pour formatter la string moisie
pseudo = chunk.toString().replace(/\r|\n/g, "");
console.log("Bonjour " + pseudo);
connect();
}
else
{
console.log("3");
if (chunk.toString().replace(/\r|\n/g, "") == "exit")
{
console.log("4");
client.sendEndMessage({pseudo : pseudo, message : chunk});
}
else
{
console.log("5");
client.sendMessage({pseudo : pseudo, message : chunk, isMessage : true});
}
}
});
function connect()
{
client.connect(port, host);
client.on('connect', function()
{
client.sendMessage({pseudo : pseudo});
client.on('message', function(message) {
console.log(message);
});
});
client.on('error', function()
{
console.log("Perte de connexion");
connect();
});
client.on('end', function()
{
process.stdin.pause();
});
};
【问题讨论】: