【发布时间】:2019-04-01 15:37:50
【问题描述】:
所以有我的代码,我正在尝试使用带有房间的 Socket.io 创建聊天室(一对一随机聊天室),但我认为存在错误,因为当我连接前两个套接字时它工作得很好,但是当我连接第三个时socket 它不再工作了我认为这是因为“麻木++”,但我不知道如何纠正它,因为我在房间里没有太多经验。我想实现:在 2 个套接字之间聊天,当第三个客户端加入时,我想创建第二个房间并等待第四个套接字加入聊天等,你我知道我想要一对一的随机聊天室,比如 Omegle。
var numb = 1;
var chnm = io.of('/STchat')
app.get('/STchat', function(req, res){
res.sendFile('C:\\Users\\tuna\\Desktop\\JUSTFOL\\views\\Tchat.html')
chnm.once('connect', function(socket){
socket.join("room" + numb)
console.log('made socket connection', socket.id);
chnm.in("room" + numb).clients(function(err, clients){
if(clients.length > 2) {
numb++
}
});
socket.on('chat', function(data) {
chnm.in("room" + numb).emit('chat',data)
})
socket.on('disconnect', function(){
console.log('socket disconnected')
});
}
});
app.get('/StvChat', function(req ,res){
res.sendFile(__dirname + '/views/VideoC.html');
});
var socket = io.connect('http://localhost:5000/STchat')
var message = document.getElementById('message');
handle = document.getElementById('handle');
btn = document.getElementById('send');
output = document.getElementById('output');
typing = document.createElement('p');
typing.className = "tycl";
input = document.getElementById("message");
$('form').submit(function(){
socket.emit('chat',{
message: message.value,
});
$('#message').val('');
return false;
});
input.addEventListener("keyup", function(event) {
event.preventDefault();
if (event.keyCode === 13) {
document.getElementById("send").click();
}
});
socket.on('chat', function(data){
output.innerHTML += '<p>' +' '+ data.message +'</p>'
});
【问题讨论】:
-
查看您的代码时我注意到的一件事是您拥有
if(clients.length > 2)。这不应该是>= 2吗?否则 numb 将在三个用户加入之前不会增加。 -
所以我明白这一点,这就是当第三个套接字连接时我无法发短信的原因?正如你所知,当第一个 2 个套接字连接时,他们可以互相发短信,但是当第三个连接时,没有人可以互相发短信,包括第一个 2 个套接字
-
我试过了,但现在只有第一个套接字可以发出文本,但是当第二个套接字连接时,第一个套接字不能再发送文本,第二个第三个等等也
-
我看到的另一个可能破坏聊天的问题是这一行:
chnm.in("room" + numb).emit('chat',data)当一个聊天事件被发出时,你正在发出任何当前值 numb 。那是行不通的,因为麻木会不断变化。您将需要执行以下两个选项之一。通过数组或数据库跟踪哪个用户(通过他们的 socket.id)在哪个房间,或者实现一种方法来确定用户在哪个房间,就像这个解决方案 stackoverflow.com/a/45315446/9436750。因此,在聊天事件中,通过他们的 socket.id 获取用户当前的房间,然后发出该房间 -
从字面上看,我不明白你在“你正在发射到任何值 numb 当前是什么”中的意思,否则,如果我创建套接字 id 数组,它将导致流量和服务器将挂起,因为如果有很多套接字同时连接代码将无法拼接数组,我考虑过那个算法,但这是我得到的最好的算法,所以我更喜欢那个,如果你解释我上面写的文字,我会很高兴谢谢
标签: node.js express socket.io chatroom