【问题标题】:socket.io random chatroom one to onesocket.io 随机聊天室一对一
【发布时间】: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 &gt; 2)。这不应该是&gt;= 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


【解决方案1】:

这太长了,不适合 cmets,所以我添加了作为答案。为了澄清,这是我在您发出聊天事件的方式中看到的一个问题。让我们来看一个场景。

var numb = 1;

两个用户(用户 A 和用户 B)连接到套接字并被放入房间“room1”。现在,numb 应该由您的代码递增,现在 numb 将 == 2。

现在,用户 A(在“room1”中)发出“聊天”事件。这是我看到的问题:

socket.on('chat', function(data) {
    chnm.in("room" + numb).emit('chat', data)

})

用户 A 的聊天事件被发送到“room2”,但用户 A 在“room1”。发生这种情况是因为场景中此时 numb == 2 并且您正在使用 numb 来发出该事件,基本上这就是 chnm.in("room" + 2) 发生的情况。用户 B 没有收到用户 A 的发射,因为它被发送到了错误的房间(房间 2)。如果我误解了您要执行的操作,请告诉我。

编辑:按照这里的要求,我对您的代码进行了一些修改,这些修改我已经在本地成功地进行了测试。每个房间有两个用户。

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) {

        // store the room in a var for convenience
        var room = "room" + numb;

        // join socket to the next open room
        socket.join(room);

        // store room on socket obj for use later - IMPORTANT
        socket.current_room = room;

        // log some stuff for testing
        console.log('made socket connection', socket.id);
        console.log("Joined room: ", socket.current_room);

        // Check room occupancy, increment if 2 or more
        chnm.in(room).clients(function(err, clients) {
            if (clients.length >= 2) {
                numb++;
            }
        });

        socket.on('chat', function(data) {
            // emit to that sockets room, now we use that current_room
            chnm.in(socket.current_room).emit('chat', data);
        });

        socket.on('disconnect', function() {
            console.log('socket disconnected');
        });
    });

});

app.get('/StvChat', function(req, res) {
    res.sendFile(__dirname + '/views/VideoC.html');
});

【讨论】:

  • 哦,我理解我的错误并且知道,但现在我在想用户 A 和用户 B 如何互相发短信?
  • 当我第一次运行我的代码时,2 个套接字可以互相聊天(用户 A 和用户 B),当我的代码中写入要在 room2 中发射时如何做到这一点?他们在房间1:/
  • 有不同的方法可以做到这一点。您需要知道的是,该用户在哪个房间。我前面提到了一些可能性。我这样做的方法是使用实​​时数据库 (RethinkDb) 来根据 socket.id 跟踪每个用户所在的房间。我将其他数据存储在用户身上,所以这个解决方案对我来说最有意义。如果您愿意,您还可以跟踪某种类型的数组中的数据,但是当您同时拥有许多用户时,管理起来可能会更加痛苦。第三种选择是使用我之前分享的解决方案,遍历房间对象并进行拼接。
  • 哦,不,你没有正确理解,我的意思是如果有那种错误,代码如何仍然可以在前两个套接字中发出聊天:D
  • 一旦第三或第四人连接它就会停止工作,对吗?因为在第三个用户连接之前,您的代码不会将 numb 增加到 2
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-11-11
  • 2016-05-24
  • 2012-01-29
  • 2017-06-20
  • 1970-01-01
  • 2018-12-30
  • 1970-01-01
相关资源
最近更新 更多