Nodejs哪位大神帮帮忙看看我这段代码为什么实现不了聊天的功能

Nodejs哪位大神帮帮忙看看我这段代码为什么实现不了聊天的功能

var net = require(‘net’);

var chatServer = net.createServer(), clientList = [] chatServer.on(‘connection’, function(client) { client.name = client.remoteAddress + ‘:’ + client.remotePort; client.write(‘Hi’ + client.name + ‘!\n’);

clientList.push(client) client.on(‘data’, function(data) { broadcast(data, client); });

client.on(‘end’, function() { clientList.splice((clientList.indexOf(client, 1))) })

client.on(‘error’, function(e) { console.log(e); }) });

function broadcast(message, client) { var cleanup = [] for(var i=0; i<clientList.length; i+=1) { if(client !== clientList[i]) {

    if(clientList[i].writable) {
        clientList[i].write(client.name + ' say ' + message)
    }else {
        cleanup.push(clientList[i])
        clientList[i].destroy()
        console.log('malegeb')
    }
}

for(i=0; i&lt;cleanup.length; i+=1) {
    console.log('malegeb')
    clientList.splice(clientList.indexOf(cleanup[i]), 1)
}

} }

chatServer.listen(9000);

在一个客户端发送信息,另一个客户端只能接收到第一个字符就停止接收了,但是另一个客户端也没有关闭,这是怎么回事?


3 回复

根据你提供的代码,问题可能出在 broadcast 函数的循环结构中。你的代码中存在一个嵌套循环,这可能会导致一些不期望的行为。让我们简化并优化你的代码,以便更好地处理多个客户端之间的消息广播。

以下是修改后的代码:

var net = require('net');

var chatServer = net.createServer();
var clientList = [];

chatServer.on('connection', function(client) {
    client.name = client.remoteAddress + ':' + client.remotePort;
    client.write('Hi ' + client.name + '!\n');
    
    clientList.push(client);

    client.on('data', function(data) {
        broadcast(data.toString(), client);
    });

    client.on('end', function() {
        clientList.splice(clientList.indexOf(client), 1);
    });

    client.on('error', function(e) {
        console.log(e);
    });
});

function broadcast(message, sender) {
    for (var i = 0; i < clientList.length; i++) {
        if (clientList[i] !== sender && clientList[i].writable) {
            clientList[i].write(sender.name + ' says: ' + message);
        }
    }
}

chatServer.listen(9000);

修改说明

  1. 删除不必要的嵌套循环:原始代码中有一个多余的循环 (for(i=0; i<cleanup.length; i+=1)), 这会导致重复的 splice 操作,从而影响 clientList 的完整性。
  2. 字符串处理:确保从客户端接收到的数据是字符串格式 (data.toString()).
  3. 简化逻辑:移除不必要的变量(如 cleanup),使代码更简洁易读。

示例场景

假设有两个客户端连接到服务器:

  • 客户端A 发送消息 “Hello World!”
  • 客户端B 接收并显示 “ClientA:Hello World!”

如果一切正常,你应该看到客户端B正确地接收到完整的消息。

通过这些调整,你的聊天应用应该能正确地实现多个客户端之间的消息广播功能。


你这代码缩进让人看得不怎么舒服。这是我以前的发表的一个帖子。不知道对楼主是否有帮助。:) ####Click here

从你的代码来看,有几个问题可能会导致聊天功能无法正常工作。以下是可能的原因及改进建议:

  1. broadcast 函数中的循环结构有问题

    • for 循环内部还有一个嵌套的 for 循环,这会导致逻辑错误。
    • 可以将清理逻辑移到循环外部,避免重复计算。
  2. 字符串拼接错误

    • client.write('Hi' + client.name + '!\n'); 中,字符串拼接没有空格,可能导致消息显示不清晰。
  3. 错误处理

    • splice 方法中参数传递错误,可能导致数组索引越界或删除错误项。

下面是修正后的代码:

var net = require('net');

var chatServer = net.createServer();
var clientList = [];

chatServer.on('connection', function (client) {
    client.name = client.remoteAddress + ':' + client.remotePort;
    client.write('Hi ' + client.name + '!\n');

    clientList.push(client);

    client.on('data', function (data) {
        broadcast(data, client);
    });

    client.on('end', function () {
        clientList.splice(clientList.indexOf(client), 1);
    });

    client.on('error', function (e) {
        console.log(e);
    });
});

function broadcast(message, client) {
    var cleanup = [];
    for (var i = 0; i < clientList.length; i += 1) {
        if (client !== clientList[i] && clientList[i].writable) {
            clientList[i].write(client.name + ' says: ' + message);
        } else if (!clientList[i].writable) {
            cleanup.push(clientList[i]);
        }
    }
    for (var i = 0; i < cleanup.length; i += 1) {
        clientList.splice(clientList.indexOf(cleanup[i]), 1);
    }
}

chatServer.listen(9000);

关键修改点:

  • 移除了嵌套的 for 循环,简化了 broadcast 函数的逻辑。
  • 修正了 splice 方法中的参数传递,确保正确删除不可写的客户端。
  • client.write 的字符串拼接中增加了空格,使输出更易读。

这样应该可以解决你提到的问题,让多个客户端能够正常接收消息。

回到顶部