socket.io случайный чат один на один
Так вот мой код, я пытаюсь создать чат с Socket.io с комнатами (случайный чат один на один), но я думаю, что есть ошибка, потому что, когда я соединяю первые два сокета, это работает отлично, но когда я соединяю третий сокет, это делает я больше не работаю, я думаю, что это из-за "онемения ++", но я не знаю, как это исправить, потому что у меня не так много опыта в комнатах. Я хочу реализовать: чат между двумя сокетами, и когда присоединяется третий клиент, я хочу создать вторую комнату и ждать, пока четвертый сокет присоединится к чату и т. д., и я знаю, что я хочу один-на-один случайный чат, такой как 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>'
});
1 ответ
Это было слишком долго, чтобы уместиться в комментариях, поэтому я добавил в качестве ответа. Чтобы уточнить, вот проблема, которую я вижу в том, как вы отправляете событие чата. Давайте пройдемся по сценарию.
var numb = 1;
Два пользователя (Пользователь A и Пользователь B) подключаются к сокету и помещаются в комнату "room1". Теперь онемение должно быть увеличено вашим кодом, и теперь онемение будет == 2.
Теперь пользователь A (который находится в "room1") генерирует событие "chat". Вот проблема, которую я вижу:
socket.on('chat', function(data) {
chnm.in("room" + numb).emit('chat', data)
})
Событие чата пользователя A отправляется в "room2", но пользователь A находится в "room1". Это происходит потому, что онемение == 2 в этой точке сценария, и вы используете онемение для генерации этого события, в основном это то, что происходит 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');
});