O2O--E家政服务 互动版

在线工具推荐: Three.js AI纹理开发包 - YOLO合成数据生成器 - GLTF/GLB在线编辑 - 3D模型格式在线转换 - 可编程3D场景编辑器

连接通信

当验证通过以后,就可以连接服务器了,我们在验证登录后面添加如下代码:

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}  });//向用户广播商家已下线
});