Socket.io 随机聊天室
Posted
技术标签:
【中文标题】Socket.io 随机聊天室【英文标题】:Socket.io random chatroom 【发布时间】: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);
);
);
【问题讨论】:
【参考方案1】:当客户端连接到/chat2
时,会发生两件事:
1.我们渲染一个chat
文件,
2. 我们在'connecting'
事件上创建一个新的监听器。
因此,每次新客户端连接时,都会创建新的侦听器。当两个客户端已经连接并成功移动到一个房间时,我们已经有两个听众 io.on('connection')
等待。当第三个客户端连接时,第一个侦听器将他推送到队列数组,然后第二个侦听器弹出他并为他和他们的同伴创建一个新房间。 socket.id
和 peer.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');
);
【讨论】:
以上是关于Socket.io 随机聊天室的主要内容,如果未能解决你的问题,请参考以下文章
使用socket.io + express + mongodb制作在线聊天室