连接通信
当验证通过以后,就可以连接服务器了,我们在验证登录后面添加如下代码:
io.on('connection', function (socket) {
var id = socket.id,
role = socket.role;
if(role == 1){
console.log('商家进入');
socket.join('shop'); //商家上线,加入商家组
var user = io.sockets.adapter.rooms['user'];
socketShops[id]=socket; //保存每个商家的连接
socketShopsName[id]=socket.name; //保存商家的名称
socketShopsService[id]=socket.service; //保存商家服务
socket.to('user').emit('message',{ cmd:'online',data: {id:id,name:socket.name,service:socket.service} }); //向每个用户发送广播,商家上线了
}else if(role == 2){
console.log('用户进入');
socket.join('user');
sockets[id]=socket;
socketsTel[id]=socket.tel;
}
}
我们要在连接事件中添加收到信息与断开连接事件。
当连接成功后,收到商家上线与下线或者用户的消息时,需要对在线的用户进行发送消息或与用户进行消息的收发。如下代码:
socket.on('message',function(packet){
var sp = packet.cmd;
switch(sp) {
case "online":
socket.send({cmd:"list",data:{names:socketShopsName,services:socketShopsService}}); //收到用户上线指令,发送所有商家信息到用户页面
break;
case "chat":
socketShops[packet.data.id].send({cmd: "rec", data:{ id:id,message:packet.data.message,name:packet.data.name,tel:packet.data.tel}}); //与商家进行通信
break;
case "ok":
sockets[packet.data.id].send({cmd:"ok",data:packet.data.message}); //与用户进行通信
break;
}
});
在上面的两段程序中,我们是不是看到了前面提到的四个发送命令关键字rec、online、list、ok了。当然服务端也有收到信息的命令。这样就实现了与客户端的通信。
当客户端发送chat命令时,我们把消息发送给商家用户;当收到online命令时,向所有用户发送所有商家信息;当收到ok命令时,将消息发送到用户页面。
当断开连接时,执行如下代码:
socket.on('disconnect',function(){
delete socketShops[id];
delete socketShopsName[id];
delete sockets[id];
delete socketsTel[id];
delete socketShopsService[id] ;
socket.to('user').emit('message',{ cmd:'list',data:{names:socketShopsName,services:socketShopsService} });//向用户广播商家已下线
});