| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384 |
- const { Server } = require("socket.io")
- const io = new Server({
- cors: {
- origin: ["*"]
- }
- });
- // 日志配置
- const log4js = require("log4js");
- log4js.configure({
- appenders: {
- console: { type: 'console' }, // 输出到控制台
- file: {
- type: 'dateFile',
- filename: "/var/www/socket/socket.log",
- pattern: '.yyyy-MM-dd', // 日期格式,按天滚动
- keepFileExt: true, // 保留文件扩展名
- numBackups: 30, // 保留的备份文件数量
- compress: true // 是否压缩旧的日志文件
- } // 输出到文件
- },
- categories: {
- default: { appenders: ['console', 'file'], level: 'debug' } // 默认使用控制台和文件输出,日志级别为 info
- }
- });
- const logger = log4js.getLogger('socket');
- // 房间
- const ROOMS = {}
- // 中间件剔除无效房间号及满员情况
- io.use((socket, next) => {
- const { roomID, name } = socket.handshake.auth;
- if (!roomID && !name) return next(new Error("invalid roomID or invalid userName"));
- const isTrue = ROOMS[roomID]
- if (isTrue) {
- // 有房间
- if (isTrue.length >= 2 && roomID != 'drawCanvas') {
- // 房间满
- return next(new Error("room is full"))
- } else {
- ROOMS[roomID].push(name)
- socket.join(roomID);
- socket.broadcast.to(roomID).emit("joined", { name: name, roomID: roomID, Length: ROOMS[roomID].length });
- }
- } else {
- // 无房间
- ROOMS[roomID] = []
- ROOMS[roomID].push(name)
- socket.join(roomID);
- socket.broadcast.to(roomID).emit("joined", { name: name, roomID: roomID, Length: ROOMS[roomID].length });
- }
- next();
- })
- io.on("connection", (socket) => {
- const { roomID, name } = socket.handshake.auth;
- logger.debug(`${name}加入${roomID}号房间人数:${ROOMS[roomID].length}`);
- // 监听其它信息
- socket.on("msg", (data) => {
- // 转发消息
- if(roomID === 'drawCanvas'){
- data.writeUInt8( socket._id , 0 );
- }
- socket.broadcast.to(roomID).emit("msg", data);
- });
- // 监听用户断开
- socket.on("disconnect", () => {
- const isHave = ROOMS[roomID].indexOf(name)
- if (isHave != -1) {
- if(roomID === 'drawCanvas') socket.broadcast.to(roomID).emit("msg", Buffer.from( [ socket._id , 8 ] ));
- socket.broadcast.to(roomID).emit("leaved", { name: name, roomID: roomID, Length: ROOMS[roomID].length });
- socket.leave(roomID)
- ROOMS[roomID].splice(isHave, 1)
- if (!ROOMS[roomID].length) delete ROOMS[roomID]
- }
- logger.debug(`${name}离开${roomID}号房间`);
- logger.debug(`所有房间:${JSON.stringify(ROOMS)}`);
- });
- })
- logger.debug(`socket服务启动:49800`)
- io.listen(49800)
|