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)