socket.io一对一随机聊天室

socket.io random chatroom one to one

所以这是我的代码,我正在尝试创建带有 Socket.io 房间的聊天室(一对一随机聊天室),但我认为存在错误,因为当我连接前两个插座时它工作正常但是当我连接第三个插座时,它不再工作了,我认为这是因为 "numb++" 但我不知道如何纠正它,因为我在房间方面的经验不多。我想实现:在 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>' 
});

这太长了,无法放入评论中,因此我将其添加为答案。澄清一下,这是我在您发出聊天事件的方式中看到的一个问题。让我们来看一个场景。

var numb = 1;

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

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

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 的发射,因为它被发送到错误的房间 (room2)。如果我误解了你的意思,请告诉我。

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

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');
});