Browse Source

增加后端服务

caner 1 year ago
parent
commit
210c09090b
2 changed files with 105 additions and 0 deletions
  1. 84 0
      service/index.js
  2. 21 0
      service/package.json

+ 84 - 0
service/index.js

@@ -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)

+ 21 - 0
service/package.json

@@ -0,0 +1,21 @@
+{
+  "name": "server",
+  "version": "1.0.0",
+  "description": "服务端",
+  "author": "Caner",
+  "main": "index.js",
+  "bin": "index.js",  
+  "scripts": {
+    "build": "pkg . --compress=GZip"
+  },
+  "license": "ISC",
+  "dependencies": {
+    "log4js": "^6.9.1",
+    "socket.io": "^4.8.1"
+  },
+  "pkg": {
+    "targets": ["node18-linux-arm64"],
+    "output": "Server",
+    "outputPath":"dist"
+  } 
+}