今天我们学习用socket.io发送消息,socket.io发送消息发送消息的情况非常多 ,大概有十来种情况。其中有四五项是我们要清楚和了解的。
给本次链接发送消息
socket.emit()
这表示客户端发送了一个消息给服务端 ,服务端收到这个消息之后给了一个callback. 也就是一个返回,比如说我要加入房间,当我加入之后他给我回一个已经加入成功。只是给我本人发的。我收到加入成功之后,我就可以做后面的逻辑处理了。这样就形成了一个异步的操作。
给某个房间内所有人发消息
io.in(room).emit()
这相当于是一个广播了,所有人就包括我自己,我发的这个消息我自己也要知道。比如还以加入房间为例,其实他要给房间中的每一个人都要发送一个消息,这个用户已经加入房间了。当然有的业务就不需要,他只是给你发送者回了“你已经加入成功了”。
还有就是各个端都要维护一个用户列表,那谁来了谁出去了,我都要清楚,这个时候就要每一个人都收到这个消息,对于发送者来说,我收到这个消息,就可以做后面的逻辑处理,做音视频的采集等。
对于其他用户来说,当我收到用户已经加入的消息的时候,就更新 一个我的用户列表,将这个用户添加到我的用户列表当中去,这是给某个房间内的所有人发消息。
io就代表整个节点,我们部署的socket节点里,上面的所有的人都包含在内,room就代表某个具体的房间,也就是说房间内的所有人要发送 。
除本连接外,给某个房间内所有人发消息
socket.to(room).emit()
也就是说在这个房间内,我发送的消息我自己不收到,其他人都收到,比如我要发一个全体静音,就是不让别人说话了,只允许我说话,那我发送消息的时候就要使用这个。
socket代表我们创建连接时的socket,给房间内的所有其他人发送消息。
除本连接外,给所有人发消息
socket.broadcast.emit()
这个是除本人外,给所有人发消息,在一个IO节点里,可能有很多个房间,比如10个或者20个房间,那么这个broadcast就是广播,我要给除我之外的所有人(整个站点的所有人)发消息。比如我发了一个通知,将节点中的所有用户都切掉,就是都要断掉去连另外的节点,然后你可以通过超级管理员的用户,给所有人发消息。
当我客户端收到消息如何处理
发送action命令
S: socket.emit('action');
C: socket.on('action',function(){...});
当S(server端)发送一个消息action,也就是一个动作,那么C(client端)要监听这个动作,通过socket.on监听这个action,它处理的时候后面带了一个函数,后面是一个具体的逻辑。
发送了一个action命令,还有data数据
S: socket.emit('action', data);
C: socket.on('action', function(data){...});
发送了一个action, 还有两个数据
S: socket.emit(action, arg1, arg1);
C: socket.on('action', function(arg1,arg2){...});
发送了一个action命令,在emit方法中包含回调函数
S: socket.emit('action',data,function(arg1,arg2){});
C: socket.on('action',function(data,fn){fn('a','b');});
也就是说服务端给你写好了一个方法,在客户端就可以直接获取到这个方法 。