index.js 2.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384
  1. const { Server } = require("socket.io")
  2. const io = new Server({
  3. cors: {
  4. origin: ["*"]
  5. }
  6. });
  7. // 日志配置
  8. const log4js = require("log4js");
  9. log4js.configure({
  10. appenders: {
  11. console: { type: 'console' }, // 输出到控制台
  12. file: {
  13. type: 'dateFile',
  14. filename: "/var/www/socket/socket.log",
  15. pattern: '.yyyy-MM-dd', // 日期格式,按天滚动
  16. keepFileExt: true, // 保留文件扩展名
  17. numBackups: 30, // 保留的备份文件数量
  18. compress: true // 是否压缩旧的日志文件
  19. } // 输出到文件
  20. },
  21. categories: {
  22. default: { appenders: ['console', 'file'], level: 'debug' } // 默认使用控制台和文件输出,日志级别为 info
  23. }
  24. });
  25. const logger = log4js.getLogger('socket');
  26. // 房间
  27. const ROOMS = {}
  28. // 中间件剔除无效房间号及满员情况
  29. io.use((socket, next) => {
  30. const { roomID, name } = socket.handshake.auth;
  31. if (!roomID && !name) return next(new Error("invalid roomID or invalid userName"));
  32. const isTrue = ROOMS[roomID]
  33. if (isTrue) {
  34. // 有房间
  35. if (isTrue.length >= 2 && roomID != 'drawCanvas') {
  36. // 房间满
  37. return next(new Error("room is full"))
  38. } else {
  39. ROOMS[roomID].push(name)
  40. socket.join(roomID);
  41. socket.broadcast.to(roomID).emit("joined", { name: name, roomID: roomID, Length: ROOMS[roomID].length });
  42. }
  43. } else {
  44. // 无房间
  45. ROOMS[roomID] = []
  46. ROOMS[roomID].push(name)
  47. socket.join(roomID);
  48. socket.broadcast.to(roomID).emit("joined", { name: name, roomID: roomID, Length: ROOMS[roomID].length });
  49. }
  50. next();
  51. })
  52. io.on("connection", (socket) => {
  53. const { roomID, name } = socket.handshake.auth;
  54. logger.debug(`${name}加入${roomID}号房间人数:${ROOMS[roomID].length}`);
  55. // 监听其它信息
  56. socket.on("msg", (data) => {
  57. // 转发消息
  58. if(roomID === 'drawCanvas'){
  59. data.writeUInt8( socket._id , 0 );
  60. }
  61. socket.broadcast.to(roomID).emit("msg", data);
  62. });
  63. // 监听用户断开
  64. socket.on("disconnect", () => {
  65. const isHave = ROOMS[roomID].indexOf(name)
  66. if (isHave != -1) {
  67. if(roomID === 'drawCanvas') socket.broadcast.to(roomID).emit("msg", Buffer.from( [ socket._id , 8 ] ));
  68. socket.broadcast.to(roomID).emit("leaved", { name: name, roomID: roomID, Length: ROOMS[roomID].length });
  69. socket.leave(roomID)
  70. ROOMS[roomID].splice(isHave, 1)
  71. if (!ROOMS[roomID].length) delete ROOMS[roomID]
  72. }
  73. logger.debug(`${name}离开${roomID}号房间`);
  74. logger.debug(`所有房间:${JSON.stringify(ROOMS)}`);
  75. });
  76. })
  77. logger.debug(`socket服务启动:49800`)
  78. io.listen(49800)