深入了解 socket.io 中 room(房间)的概念和使用一

3,074 阅读1分钟

小知识,大挑战!本文正在参与“程序员必备小知识”创作活动。

  1. 在不加入或指定room的情况下,socket.io 会默认分配一个default room
  2. 同一room下的socket可以广播消息
  3. join(房间名)加入一个房间;leave(房间名) 离开一个房间;broadcast.to(房间名).emit() 给同一个房间的其他socket广播消息
var http=require("http");
var express=require("express");//引入express
var socketIo=require("socket.io");//引入socket.io

var app=new express();

var server=http.createServer(app);
var io=new socketIo(server);//将socket.io注入express模块

//客户端 1 的访问地址
app.get("/client1",function (req,res,next) {
    res.sendFile(__dirname+"/views/client1.html");
});
app.get("/client2",function (req,res,next) {
    res.sendFile(__dirname+"/views/client2.html");
});
server.listen(8080);//express 监听 8080 端口,因为本机80端口已被暂用
console.log("服务已启动");

//每个客户端socket连接时都会触发 connection 事件
io.on("connection",function (clientSocket) {
    // socket.io 使用 emit(eventname,data) 发送消息,使用on(eventname,callback)监听消息

    //加入房间
    clientSocket.on("joinRoom",function (data,fn) {
        clientSocket.join(data.roomName); // join(房间名)加入房间
        fn({"code":0,"msg":"加入房间成功","roomName":data.roomName});
    });
    //退出 离开房间
    clientSocket.on("leaveRoom",function (data,fn) {
        clientSocket.leave(data.roomName);//leave(房间名) 离开房间
        fn({"code":0,"msg":"已退出房间","roomName":data.roomName});
    });
    //监听客户端发送的 sendMsg 事件
    clientSocket.on("sendMsg",function (data,fn) {
        // data 为客户端发送的消息,可以是 字符串,json对象或buffer

        // 使用 emit 发送消息,broadcast 表示 除自己以外的所有已连接的socket客户端。
        // to(房间名)表示给除自己以外的同一房间内的socket用户推送消息
        clientSocket.broadcast.to(data.roomName).emit("receiveMsg",data);
        fn({"code":0,"msg":"消息发生成功"});
    })
});