【问题标题】:Socket.io random chatroomSocket.io 随机聊天室
【发布时间】:2017-09-21 20:06:43
【问题描述】:

我正在尝试创建一个应用程序(类似omegle),人们可以在其中登录并与随机的人交谈。
案例:当两个人(客户)登录然后console.log(房间);在客户端(聊天开始事件)中打印房间。但是当第三个客户端登录而不是等待时,他创建了一个新房间并与另外两个创建新房间中的一个连接。根据我的情况,这不应该发生函数 findPeerForLoneSocket(socket);

服务器端:

// Socket.io Setup
var io = socket(server);
var allUsers = {};  
var rooms = {};
var queue = [];
var names =[];

 app.get('/chat2',function(req,res){
   if (req.isAuthenticated()) {
    res.render('chat');
    var findPeerForLoneSocket = function(socket) {
      if (queue.length > 0) {
          var peer= queue.pop();
          var room = socket.id + '#' + peer.id;
          peer.join(room);
          socket.join(room);
          rooms[peer.id] = room;
          rooms[socket.id] = room;
          peer.emit('chat start', {'name': names[socket.id], 'room':room});
          socket.emit('chat start', {'name': names[peer.id], 'room':room});
      } else {
          queue.push(socket);
      }
    }

    io.on('connection', function(socket) {      
      findPeerForLoneSocket(socket);
    });

} else {
    res.redirect('/');
  }
})

客户端:

   $(document).ready(function(){
  var socket = io('http://localhost:3000');
  var connected = false;
 var message = document.getElementById('message'),


handle = document.getElementById('handle'),
  btn = document.getElementById('send'),
  btn2 = document.getElementById('next'),
  output = document.getElementById('output');

  socket.on('connect', function (data) {
    connected = true;
  });

  socket.on('chat start', function(data) {
    $( "#connecting" ).remove();
    $( "#connected" ).text('Connected...');
      room = data.room;
      console.log(room);   
  });
});

【问题讨论】:

    标签: node.js sockets express websocket socket.io


    【解决方案1】:

    当客户端连接到/chat2 时,会发生两件事:
    1.我们渲染一个chat文件,
    2. 我们在'connecting' 事件上创建一个新的监听器。

    因此,每次新客户端连接时,都会创建新的侦听器。当两个客户端已经连接并成功移动到一个房间时,我们已经有两个听众 io.on('connection') 等待。当第三个客户端连接时,第一个侦听器将他推送到队列数组,然后第二个侦听器弹出他并为他和他们的同伴创建一个新房间。 socket.idpeer.id 都是一样的,所以第三个客户自己聊天。 当第四个客户端连接时,已经有三个监听器了......

    您必须从app.get 代码中取出io.on('connecting'),如下例所示(为调试添加了几个console.logs)。

    const express = require('express');
    const app = express();
    const http = require('http').Server(app);
    const io = require('socket.io')(http);
    
    var queue = [];
    
    var findPeerForLoneSocket = function(socket) {
        if (queue.length > 0) {
            var peer= queue.pop();
            console.log(peer.id + ' was popped from queue\n');
            log(queue);
            var room = socket.id + '#' + peer.id;
            peer.join(room);
            socket.join(room);
            console.log(socket.id + ' and ' + peer.id + ' joined room ' + room);
            peer.emit('chat start', {'name': socket.id, 'room':room});
            socket.emit('chat start', {'name': peer.id, 'room':room});
        } else {
            queue.push(socket);
            console.log(socket.id + ' was pushed to queue\n');
            log(queue);
        }
    };
    
    var log = arr => {
        console.log('Queue: ');
        for (let i = arr.length; i--;) {
            console.log(arr[i].id);
        }
        console.log('\n');
    };
    
    io.on('connection', function (socket) {
        console.log(socket.id + ' connected');
        findPeerForLoneSocket(socket);
    });
    
    http.listen(3000, function(){
        console.log('express + socket.io server listening on *:3000');
    });
    
    app.get('/', (req,res) => {
        res.sendFile(__dirname + '/sterg.html');
    });
    

    【讨论】:

      猜你喜欢
      • 2019-04-01
      • 1970-01-01
      • 2012-01-29
      • 2017-06-20
      • 1970-01-01
      • 1970-01-01
      • 2016-05-24
      • 2020-01-28
      • 2017-05-31
      相关资源
      最近更新 更多