Подтвердить что ты не робот

Особенности Socket.IO

У меня есть два отдельных файла, один из которых - серверный JS.

Другой - динамически созданный клиентский PHP.

Эти два файла успешно взаимодействуют друг с другом через Socket.IO.

Я понимаю, что я могу ограничить пространство имен, используя .of(), но не могу использовать

для обработки динамически созданных чатов.

Итак, я решил использовать оба

.of('/chat') 

и функция комнаты

.join('room name') 

Я мог бы найти пример на стороне сервера и не мог найти с ним пример на стороне клиента.

Ниже приведен единственный фрагмент кода на стороне сервера из Socket.IO github

var io = require('socket.io').listen(80);

io.sockets.on('connection', function (socket) {
    socket.join('justin bieber fans');
    socket.broadcast.to('justin bieber fans').emit('new fan');
    io.sockets.in('rammstein fans').emit('new non-fan');
});

1) У меня возникли проблемы с пониманием ниже.

socket.broadcast.to('justin bieber fans').emit('new fan');
io.sockets.in('rammstein fans').emit('new non-fan');

В чем разница между этими двумя?

2) почему бы не использовать

socket.to('room name').emit('event')

вместо

io.sockets.in('room name').emit('new non-fan');

3) Наконец, я нашел несколько документов, в которых с помощью

.send()

вместо

.emit()

Несколько .send() не работает для меня, и я хочу знать разницу между этими двумя.

Спасибо, и я приношу свои извинения за многочисленные вопросы о Socket.IO.

4b9b3361

Ответ 1

Я не использовал Socket.IO через некоторое время, но

1.) Как указано в документации: "Broadcasting означает отправку сообщения всем остальным, кроме сокета, который его запускает". После некоторого поиска с помощью кода Socket.IO вы можете посмотреть Socket.prototye.packet в /lib/socket.js.

Когда вы делаете свой первый звонок, вы настраиваете пользователя на "поклонников биндера" justin "и передаете" новый поклонник "всем, кроме сокета. Во втором случае вы передаете всем поклонникам "rammstein" для отправки "новых не-вентиляторов".

2). В первом вызове вы вызываете "событие" только для одного пользователя и сообщение в эту комнату.

Во втором вызове вы отправляете всех в эту комнату.

3). Еще раз, глядя на исходный код, они оба выглядят довольно похожими, за исключением того, что протокол socket.io принимает 3 разных типа сообщений: "событие", "json", "message". С помощью .send вы можете отправить строку json или сообщение. С помощью .emit вы собираетесь отправить событие клиенту. Это не имеет большого значения, они почти обрабатываются одинаково, но вы должны использовать тот, который наилучшим образом соответствует вашим потребностям.

Ответ 2

1) -

i) io.sockets.in(). emit(): он испускает/отправляет настраиваемое событие всем в x комнате. Пример;.

/* Send message to the room1. It broadcasts the data to all 
   the socket clients which are connected to the room1 */

io.sockets.in('room1').emit('function', {foo:bar
});

ii) socket.broadcast.to(). emit(): я выбрал/отправил настраиваемое событие всем, кроме отправителя в x комнате. Пример;.

io.sockets.on('connection', function (socket) {
    socket.on('function', function(data){

        /* Broadcast to room1 except the sender. In other word, 
            It broadcast all the socket clients which are connected 
            to the room1 except the sender */
        socket.broadcast.to('room1').emit('function', {foo:bar});

    }
}

2) -. Сначала вы эмулируете/отправляете настраиваемое событие одному клиенту (один сокет). Во-вторых, вы эмулируете/отправляете настраиваемое событие всем клиентам в x комнате.

3) - Разные между emit() и send();

socket.emit(): - это функция, которая испускает/отправляет настраиваемое событие с данными тому, кому вы хотите. socket.emit() принимает не менее двух параметров, первый - это имя настраиваемого события, второе и т.д. - это данные, которые вы хотите передать. Пример;.

socket.emit('addUser',{nickname:'John'});

И вам, вероятно, нужно зарегистрироваться и прослушать это пользовательское событие, используя socket.on(). Пример:.

socket.on('addUser',function(data){
    console.log(data.nickname); // it will return 'John'
}

socket.send(): почти так же, как и socket.emit(), на этот раз он использует имя сообщения по умолчанию "message". поэтому он принимает только один параметр, данные, которые вы хотите передать. Пример:.

socket.send('hi');

И на этот раз вы зарегистрируетесь и прослушаете имя события 'message',

socket.on('message', function (data) {
  console.log(data);  // it will return 'hi'
})

Надеюсь, это поможет!

Ответ 3

Я хорошо использую функцию комнаты с RedisStore.

Как вы можете видеть в исходных файлах Socket.io.

Функция номера (подписка и отмена подписки Redis используется для реализации этой функции) кажется

доступен только с использованием RedisStore, но не с памятью по умолчанию.

Я нашел

{}

пустой источник для join и оставьте на memoryStore.

Поэтому я рекомендую использовать RedisStore, который хотел бы сгруппировать коннекторы Socket.io

между несколькими процессами и несколькими серверами

а также для успешного использования функции номера Socket.io