【问题标题】:Issue on a Json over TCP connection in nodeJsnodeJs中基于TCP连接的Json问题
【发布时间】: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();
    });
};

【问题讨论】:

    标签: json node.js sockets tcp


    【解决方案1】:

    我想你会发现是因为 server.js 中的这一行放错了地方:

    sockets.push({socket : socket, pseudo : sender});
    

    它应该作为“连接”处理程序的一部分完成,而不是每次有消息时。

    编辑

    我从json-socket example 运行了你的代码,我没有将回调函数传递给createServer,而是单独创建了处理程序:(这似乎可行!)

    var net = require('net'), JsonSocket = require('json-socket');
    var sockets = [];
    var server = net.createServer();
    
    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});
            console.log('Clients connected =', sockets.length());
    
                sockets.forEach(function(s)
                {
                    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);
                    }
                });
            }
        });
    });
    
    server.on('error', function()
    {
        socket.emit('end');
    });
    
    server.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);
    

    【讨论】:

    • 对不起 - 昨晚太晚了,我再也没有回复你这么抱歉!
    • 我已经编辑了答案,给出了一些对我有用的代码......让我知道你的进展情况!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-07-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多