问题 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的多个问题道歉。


11428
2017-10-07 02:02


起源

一个很好的问题,显示了socket.io文档的糟糕状态。 - vsync


答案:


我很久没有使用过Socket.IO了

1.)正如文档所述:“广播意味着向除了启动它的套接字之外的所有人发送消息。” 在使用Socket.IO代码进行一些搜索之后,您可以查看/lib/socket.js中的Socket.prototye.packet。

当您第一次打电话时,您将用户设置为“justin bieber粉丝”会议室,并为除插座之外的所有人播放“新粉丝”。 在第二个例子中,你正在为'rammstein粉丝'中的每个人播放'发送新的非粉丝'。

2.) 在第一次调用中,您只为单个用户发出“事件”,并向该单个房间发送消息。

在第二个电话中,您将发送给该​​房间中的每个人。

3.) 再一次,查看源代码,它们看起来非常相似,只是socket.io协议接受 3种不同的消息:“event”,“json”,“message”。 使用.send,您可以发送json字符串或消息。 使用.emit,您将向客户端发送一个事件。 它并没有多大区别,它们几乎在内部处理相同,但您应该使用最适合您需求的那个。


6
2017-10-07 06:08



我决定在socket.io中实现我自己的“房间”方式。谢谢你的信息。 - InspiredJW
我同意你的意见,房间系统不是很清楚,而且似乎超出了我希望Socket.IO做的范围。 - Nican
现在,它的效果非常好。有时手动方式,由我自己实施更好:) - InspiredJW


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) -  首先,您将自定义事件发送/发送到单个客户端(套接字1)。 第二个,您向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');

这次你注册并收听'消息'事件名称;

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

希望这会有所帮助!


9
2018-04-30 00:21





我正在使用RedisStore的房间功能。

正如您在Socket.io源文件中看到的那样。

房间功能(Redis'订阅和取消订阅用于实现该功能)似乎

只能使用RedisStore但不能使用默认的memoryStore。

我已经发现

{}

空的来源 加入 和 离开 在memoryStore上。

所以我建议使用想要集群Socket.io conenctions的RedisStore

多个进程和多个服务器之间

并且还成功使用了Socket.io的房间功能


1
2018-04-28 01:44



奇怪。看起来它对我来说是默认的内存存储 - Christopher Tarquini