|
|
@@ -0,0 +1,84 @@
|
|
|
+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)
|