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<cleanup.length; i+=1) {
console.log('malegeb')
clientList.splice(clientList.indexOf(cleanup[i]), 1)
}
}
}
chatServer.listen(9000);
在一个客户端发送信息,另一个客户端只能接收到第一个字符就停止接收了,但是另一个客户端也没有关闭,这是怎么回事?
根据你提供的代码,问题可能出在 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);
修改说明
- 删除不必要的嵌套循环:原始代码中有一个多余的循环 (
for(i=0; i<cleanup.length; i+=1)
), 这会导致重复的splice
操作,从而影响clientList
的完整性。 - 字符串处理:确保从客户端接收到的数据是字符串格式 (
data.toString()
). - 简化逻辑:移除不必要的变量(如
cleanup
),使代码更简洁易读。
示例场景
假设有两个客户端连接到服务器:
- 客户端A 发送消息 “Hello World!”
- 客户端B 接收并显示 “ClientA:Hello World!”
如果一切正常,你应该看到客户端B正确地接收到完整的消息。
通过这些调整,你的聊天应用应该能正确地实现多个客户端之间的消息广播功能。
你这代码缩进让人看得不怎么舒服。这是我以前的发表的一个帖子。不知道对楼主是否有帮助。:) ####Click here
从你的代码来看,有几个问题可能会导致聊天功能无法正常工作。以下是可能的原因及改进建议:
-
broadcast
函数中的循环结构有问题:for
循环内部还有一个嵌套的for
循环,这会导致逻辑错误。- 可以将清理逻辑移到循环外部,避免重复计算。
-
字符串拼接错误:
- 在
client.write('Hi' + client.name + '!\n');
中,字符串拼接没有空格,可能导致消息显示不清晰。
- 在
-
错误处理:
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
的字符串拼接中增加了空格,使输出更易读。
这样应该可以解决你提到的问题,让多个客户端能够正常接收消息。